O typeof
operador realmente não nos ajuda a encontrar o tipo real de um objeto.
Eu já vi o seguinte código:
Object.prototype.toString.apply(t)
Questão:
É a maneira mais precisa de verificar o tipo do objeto?
javascript
Royi Namir
fonte
fonte
Respostas:
A especificação JavaScript fornece exatamente uma maneira adequada de determinar a classe de um objeto:
http://bonsaiden.github.com/JavaScript-Garden/#types
fonte
Object.prototype.toString.call(new FormData()) === "[object FormData]"
que seria verdade. Você também pode usarslice(8, -1)
para retornar emFormData
vez de[object FormData]
Object.prototype
e{}
?Object.prototype.toString.call(new MyCustomObject())
retorna[object Object]
ao passonew MyCustomObject() instanceOf MyCustomObject returns true
que é o que eu queria (Chrome 54.0.2840.99 m)new MyCustomObject().constructor === MyCustomObject
.o
Object.prototype.toString
é uma boa maneira, mas seu desempenho é o pior.http://jsperf.com/check-js-type
Use
typeof
para resolver algum problema básico (String, Number, Boolean ...) e useObject.prototype.toString
para resolver algo complexo (como Array, Date, RegExp).e esta é a minha solução:
use como:
fonte
type
função é boa, mas veja como ela se compara a outrastype
funções. http://jsperf.com/code-type-test-a-test({}).toString.call(obj)
é mais lento do queObject.prototype.toString
jsperf.com/object-check-test77A resposta aceita está correta, mas eu gosto de definir esse pequeno utilitário na maioria dos projetos que construo.
Usado assim:
Se você estiver usando angular, você pode até injetá-lo de forma limpa:
fonte
Mantenha um controle sobre o protótipo que você espera que o objeto tenha e depois compare-o.
por exemplo
fonte
o instanceof String; //true
?"foo" instanceof String
quebratypeof(x)==='string'
.Object.getPrototypeOf(true)
falha onde(true).constructor
retornaBoolean
.Eu diria que a maioria das soluções mostradas aqui sofre de excesso de engenharia. Provavelmente, a maneira mais simples de verificar se um valor é do tipo
[object Object]
é verificar a.constructor
propriedade dele:ou ainda mais curto com as funções de seta:
A
a != null
peça é necessária porque é possível passarnull
ouundefined
você não pode extrair uma propriedade de construtor de nenhuma delas.Funciona com qualquer objeto criado via:
Object
construtor{}
Outro recurso interessante é a capacidade de fornecer relatórios corretos para classes personalizadas que são utilizadas
Symbol.toStringTag
. Por exemplo:O problema aqui é que, ao chamar
Object.prototype.toString
uma instância dela, o relatório falso[object Object]
será retornado:Mas a verificação no construtor fornece um resultado correto:
fonte
A melhor maneira de descobrir o tipo REAL de um objeto (incluindo AMBOS o nome nativo do objeto ou DataType (como String, Data, Número, etc. etc) E o tipo REAL de um objeto (mesmo os personalizados); a propriedade name do construtor do protótipo do objeto:
Tipo nativo Ex1:
exibe:
Ex2:
exibe:
Classes personalizadas:
exibe:
fonte
null
ouundefined
.Velha pergunta eu sei. Você não precisa convertê-lo. Veja esta função:
Exemplos:
Baixo custo e simples.
fonte
false
se o objeto de teste énull
ouundefined
true
oufalse
false
. Como isso ajuda a responder à pergunta?Eu montei um pequeno utilitário de verificação de tipo inspirado nas respostas corretas acima:
exemplo:
fonte
null
ouundefined
outrue
oufalse