
typeof e instanceof de se utilizan para determinar los tipos de datos, pero sus escenarios de uso son diferentes y algunos detalles requieren atención especial. Averigüemos a continuación, dominemos a fondo este punto de conocimiento y ya no tengamos miedo de las preguntas del entrevistador.
typeof es un operador unario colocado delante de un operando, que puede ser de cualquier tipo. Devuelve una cadena que describe el tipo de operando. Mire la castaña:
const type = typeof 'Long Live China' // string;
tipo de 666 //número
tipo de verdadero; // booleano
tipo de indefinido; // indefinido
tipo de símbolo(); // símbolo
tipo de 1n; // bigint
tipo de () => {}; // función
tipo de []; // objeto
tipo de {}; // objeto
tipo de nueva cadena ('xxx'); // objeto
typeof null; // objeto Como se puede ver en los ejemplos anteriores, typeof solo puede determinar con precisión los tipos de datos y funciones básicos (las funciones son en realidad objetos y no pertenecen a otro tipo de datos, pero también se pueden distinguir usando typeof) y no determinar con precisión el tipo de datos de referencia (todos los objetos devueltos).
Una cosa a tener en cuenta es que llamar typeof null devuelve object . Esto se debe a que el valor especial null se considera una referencia a un objeto nulo (también llamado puntero de objeto nulo).
Si desea determinar con precisión el tipo de datos de referencia, puede utilizar instanceof .
El operador instanceof de se coloca después de un operando y antes del objeto dado. Devuelve un valor booleano que indica si el operando es una instancia del objeto dado:
const resultado = [] instancia de Array // verdadero;
const Persona = función() {};
const p = nueva Persona();
p instancia de Persona; // verdadero
mensaje constante = nueva cadena ('xxx');
mensaje instancia de Cadena; // verdadera tipo de devolverá el tipo básico de un operando, instancia de devuelve un valor booleano
instancia de puede determinar con precisión el tipo de datos de referencia, pero no puede determinar correctamente el tipo de datos básicos
tipo de aunque puede determinar el tipo de datos básicos ( excepto null), pero es imposible determinar el tipo de datos de referencia (excepto la función)
typeof como instanceof tienen ciertos inconvenientes y no pueden satisfacer las necesidades de todos los escenarios. Si necesita detectar tipos de datos universalmente, puede utilizar Object.prototype.toString.call() :
Object.prototype.toString.call({}); // "[object Object]"
Object.prototype.toString.call([]); // "[matriz de objetos]"
Object.prototype.toString.call(666); // "[Número de objeto]"
Object.prototype.toString.call('xxx'); // "[object String]" Tenga en cuenta que este método devuelve una cadena en el formato "[object Object]" .
Para un uso más conveniente, podemos encapsular este método:
function getType(value) {
let tipo = tipo de valor;
if (type!== 'object') { // Si es un tipo de datos básico, devuelve directamente return type;
}
// Si es un tipo de datos de referencia, se realiza una evaluación adicional y el resultado de retorno normal es return Object.prototype.toString.call(value).replace(/^[object (S+)]$/, ' $1');
}
getType(123); // número
getType('xxx'); // cadena
getType(() => {}); // función
getType([]); // Matriz
getType({}); // Objeto
getType(nulo); // Nulo