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