Existe uma maneira melhor de obter o tipo de uma variável em JS do que typeof
? Funciona bem quando você faz:
> typeof 1
"number"
> typeof "hello"
"string"
Mas é inútil quando você tenta:
> typeof [1,2]
"object"
>r = new RegExp(/./)
/./
> typeof r
"function"
Eu sei instanceof
, mas isso exige que você saiba o tipo de antemão.
> [1,2] instanceof Array
true
> r instanceof RegExp
true
Existe uma maneira melhor?
javascript
types
typeof
Aillyn
fonte
fonte
typeof new RegExp(/./); // "function"
problema no Chrome parece ser fixado no Chrome 14.n
vez do nome original esperado. por exemplo,constructor.name
pode dar-lhen
, em vez do nome completo esperadoRespostas:
Angus Croll escreveu recentemente um post interessante no blog sobre isso -
http://javascriptweblog.wordpress.com/2011/08/08/fixing-the-javascript-typeof-operator/
Ele analisa os prós e contras dos vários métodos e define um novo método 'toType' -
fonte
ActiveXObject
Instâncias do Internet Explorer , por exemplo.match(/\s([a-z,_,:,A-Z]+)/)
Uint8Array
. Em vez disso, considere o mais geralmatch(/\s([^\]]+)/)
que deve lidar com qualquer coisa.\w
operador palavra em vez ...Você pode tentar usar
constructor.name
.Como em todo JavaScript, alguém eventualmente invariavelmente aponta que isso é de alguma forma ruim, então aqui está um link para uma resposta que cobre isso muito bem.
Uma alternativa é usar
Object.prototype.toString.call
fonte
name
é uma extensão do ECMAScript e não funcionará em todos os navegadores.constructor.name
provavelmente pode acabar sendo algo como, emn
vez do nome do objeto que você espera. Portanto, tenha cuidado com isso - especialmente se você reduzir apenas a produção.null
eundefined
infelizmente não tem um construtor.Uma função de captura de tipo razoavelmente boa é aquela usada pelo YUI3 :
Isso captura muitas das primitivas fornecidas pelo javascript, mas você sempre pode adicionar mais modificando o
TYPES
objeto. Observe quetypeof HTMLElementCollection
no Safari será relatadofunction
, mas o tipo (HTMLElementCollection) retornaráobject
fonte
Você pode achar útil a seguinte função:
Ou no ES7 (comente se houver mais melhorias)
Resultados:
Obrigado @johnrees por me notificar de: error, promessa, generatorfunction
fonte
typeOf(new Date())
typeOf(Promise.resolve())//promise
typeOf(function *() {})//generatorfunction
[ts] Cannot redeclare block-scoped variable 'toString'
Também podemos mudar um pequeno exemplo de ipr101
e chame como
fonte
função de uma linha:
isso dá o mesmo resultado que
jQuery.type()
fonte
Você pode aplicar
Object.prototype.toString
a qualquer objeto:Isso funciona bem em todos os navegadores, com exceção do IE - ao chamar isso em uma variável obtida de outra janela, ela é expelida
[object Object]
.fonte
Meus 2 ¢! Realmente, parte da razão pela qual estou lançando isso aqui, apesar da longa lista de respostas, é fornecer um pouco mais de
all in one
solução de tipo e receber um feedback no futuro sobre como expandi-lo para incluir maisreal types
.Com a solução a seguir, como mencionado acima, eu combinei algumas soluções encontradas aqui, além de incorporar uma correção para retornar um valor jQueryno objeto definido no jQuery, se disponível . Também anexo o método ao protótipo de objeto nativo. Eu sei que isso geralmente é um tabu, pois pode interferir em outras extensões, mas deixo isso para
user beware
. Se você não gosta dessa maneira, simplesmente copie a função base em qualquer lugar que desejar e substitua todas as variáveisthis
por um parâmetro de argumento para passar (como argumentos [0]).Em seguida, basta usar com facilidade, assim:
Mais exemplos:
Se você tiver algo a acrescentar que talvez seja útil, como definir quando um objeto foi criado com outra biblioteca (Moo, Proto, Yui, Dojo, etc ...), sinta-se à vontade para comentar ou editar isso e mantê-lo mais preciso e preciso. OU passe para o que GitHubeu fiz e me avise. Você também encontrará um link rápido para um arquivo cdn min.
fonte
Nos meus testes preliminares, isso está funcionando muito bem. O primeiro caso imprimirá o nome de qualquer objeto criado com "novo", e o segundo caso deverá capturar todo o resto.
Estou usando
(8, -1)
porque estou assumindo que o resultado sempre começará[object
e terminará,]
mas não tenho certeza de que seja verdade em todos os cenários.fonte
Eu acho que a solução mais universal aqui - é para verificar se
undefined
enull
em primeiro lugar, em seguida, é só chamarconstructor.name.toLowerCase()
.fonte
.constructor.name
sempre contém o valor da string. Para indefinido / nulo, temos as seqüências apropriadas retornadas pela função.constructor
é uma propriedade herdada, isso interrompe os objetos criados comObject.create(null)
. Simples o suficiente para consertar, mas como chamá-lo? "[objeto nulo]"?typeof
condição é usada para verificar o tipo de variável, se você estiver verificar o tipo de variável na condição if-else, por exemplofonte