typeof
e instanceof
são usados para determinar os tipos de dados, mas seus cenários de uso são diferentes e alguns detalhes requerem atenção especial. Vamos descobrir a seguir, dominar a fundo esse ponto de conhecimento e não ter mais medo das perguntas do entrevistador.
typeof
um operador unário colocado na frente de um operando, que pode ser de qualquer tipo. Ele retorna uma string descrevendo o tipo do operando. Por favor, olhe para a castanha:
const type = typeof 'Long Live China' // string; tipo de 666; tipo de verdadeiro; // booleano tipo de indefinido; // indefinido typeofSímbolo(); tipo de 1n; // bigint typeof() => {}; tipo de []; tipo de {}; typeof new String('xxx'); typeof null; // object
Como pode ser visto nos exemplos acima, typeof
só pode determinar com precisão tipos de dados e funções básicas (funções são na verdade objetos e não pertencem a outro tipo de dados, mas também podem ser distinguidas usando typeof) e não podem ser determinado com precisão. Tipo de dados de referência de saída (todos os objetos de retorno).
Uma coisa a observar é que chamar typeof null
retorna object
. Isso ocorre porque o valor especial null
é considerado uma referência a um objeto nulo (também chamado de ponteiro de objeto nulo).
Se quiser determinar com precisão o tipo de dados de referência, você pode usar instanceof
.
O operador instanceof
é colocado após um operando e antes do objeto fornecido. Retorna um valor booleano indicando se o operando é uma instância do objeto fornecido:
const result = [] instanceof Array; const Pessoa = função() {}; const p = nova Pessoa(); p instância de Pessoa; // verdadeiro mensagem const = new String('xxx'); mensagem instanceof String; // verdadeira
typeof retornará o tipo básico de um operando, instanceof retorna um valor booleano
instanceof pode determinar com precisão o tipo de dados de referência, mas não pode determinar corretamente o tipo de dados básico
typeof embora possa determinar o tipo de dados básico ( exceto null), mas é impossível determinar o tipo de dados de referência (exceto função)
typeof
e instanceof
têm certas desvantagens e não podem atender às necessidades de todos os cenários. Se precisar detectar tipos de dados universalmente, você pode usar Object.prototype.toString.call()
:
Object.prototype.toString.call({}); Object.prototype.toString.call([]); // "[array de objetos]" Object.prototype.toString.call(666); // "[Número do objeto]" Object.prototype.toString.call('xxx'); // "[object String]"
Observe que este método retorna uma string no formato de "[object Object]"
.
Para uso mais conveniente, podemos encapsular este método:
function getType(value) { deixe tipo = tipo de valor; if (type !== 'object') { // Se for um tipo de dados básico, retorne diretamente return type; } // Se for um tipo de dados de referência, um julgamento adicional será feito e o resultado de retorno regular será return Object.prototype.toString.call(value).replace(/^[object (S+)]$/, ' $1'); } getType(123); getType('xxx'); //string getType(() => {}); //função getType([]); getType({}); // Objeto getType(nulo); // Nulo