¿Hay una mejor manera de obtener el tipo de una variable en JS que typeof
? Funciona bien cuando haces:
> typeof 1
"number"
> typeof "hello"
"string"
Pero es inútil cuando intentas:
> typeof [1,2]
"object"
>r = new RegExp(/./)
/./
> typeof r
"function"
Lo sé instanceof
, pero esto requiere que sepas el tipo de antemano.
> [1,2] instanceof Array
true
> r instanceof RegExp
true
¿Hay una mejor manera?
javascript
types
typeof
Aillyn
fuente
fuente
typeof new RegExp(/./); // "function"
problema en Chrome parece estar solucionado en Chrome 14.n
lugar del nombre original esperado. por ejemplo,constructor.name
podría darte enn
lugar del nombre completo esperadoRespuestas:
Angus Croll escribió recientemente una publicación de blog interesante sobre esto:
http://javascriptweblog.wordpress.com/2011/08/08/fixing-the-javascript-typeof-operator/
Revisa los pros y los contras de los diversos métodos y luego define un nuevo método 'toType':
fuente
ActiveXObject
Instancias de Internet Explorer , por ejemplo.match(/\s([a-z,_,:,A-Z]+)/)
Uint8Array
. En cambio, considere el más generalmatch(/\s([^\]]+)/)
que debería manejar cualquier cosa.\w
palabra operador en su lugar ...Puedes intentar usarlo
constructor.name
.Al igual que con todo JavaScript, alguien eventualmente señalará invariablemente que esto es de alguna manera malvado, así que aquí hay un enlace a una respuesta que cubre esto bastante bien.
Una alternativa es usar
Object.prototype.toString.call
fuente
name
es una extensión de ECMAScript y no funcionará en todos los navegadores.constructor.name
es probable que termine siendo algo así comon
el nombre de objeto que espera. Así que ten cuidado con eso, especialmente si solo minimizas la producción.null
yundefined
desafortunadamente no tengo un constructor.Una función de captura de tipo razonablemente buena es la utilizada por YUI3 :
Esto captura muchas de las primitivas proporcionadas por javascript, pero siempre puede agregar más modificando el
TYPES
objeto. Tengatypeof HTMLElementCollection
en cuenta que en Safari informaráfunction
, pero el tipo (HTMLElementCollection) devolveráobject
fuente
Puede encontrar útil la siguiente función:
O en ES7 (comenta si hay más mejoras)
Resultados:
Gracias @johnrees por notificarme de: error, promesa, función del generador
fuente
typeOf(new Date())
typeOf(Promise.resolve())//promise
typeOf(function *() {})//generatorfunction
[ts] Cannot redeclare block-scoped variable 'toString'
También podemos cambiar un pequeño ejemplo de ipr101
y llama como
fuente
función de una línea:
esto da el mismo resultado que
jQuery.type()
fuente
Se puede aplicar
Object.prototype.toString
a cualquier objeto:Esto funciona bien en todos los navegadores, con la excepción de IE: al invocar esto en una variable obtenida de otra ventana, simplemente escupirá
[object Object]
.fuente
¡Mis 2 ¢! Realmente, parte de la razón por la que estoy lanzando esto aquí, a pesar de la larga lista de respuestas, es proporcionar una
all in one
solución de tipo un poco más y obtener información en el futuro sobre cómo expandirla para incluir másreal types
.Con la siguiente solución, como se mencionó anteriormente, combiné un par de soluciones encontradas aquí, así como también incorporé una solución para devolver un valor de jQueryun objeto definido en jQuery si está disponible . También agrego el método al prototipo de objeto nativo. Sé que a menudo es tabú, ya que podría interferir con otras extensiones, pero lo dejo
user beware
. Si no le gusta esta forma de hacerlo, simplemente copie la función base en cualquier lugar que desee y reemplace todas las variablesthis
con un parámetro de argumento para pasar (como los argumentos [0]).Luego, simplemente use con facilidad, así:
Más ejemplos:
Si tiene algo que agregar que pueda ser útil, como definir cuándo se creó un objeto con otra biblioteca (Moo, Proto, Yui, Dojo, etc.), siéntase libre de comentar o editar esto y mantenerlo como más exacto y preciso. O pasar al GitHubque hice para hacerme saber. También encontrará un enlace rápido a un archivo cdn min allí.
fuente
En mis pruebas preliminares, esto funciona bastante bien. El primer caso imprimirá el nombre de cualquier objeto creado con "nuevo", y el segundo caso debería capturar todo lo demás.
Estoy usando
(8, -1)
porque supongo que el resultado siempre comenzará[object
y terminará,]
pero no estoy seguro de que eso sea cierto en cada escenario.fuente
Supongo que la solución más universal aquí es verificar
undefined
ynull
primero, luego simplemente llamarconstructor.name.toLowerCase()
.fuente
.constructor.name
siempre contiene el valor de la cadena. Para undefined / null tenemos las cadenas apropiadas devueltas por la función.constructor
es una propiedad heredada, esto se rompe para los objetos creados conObject.create(null)
. Lo suficientemente simple como para arreglarlo, pero ¿cómo llamarlo? "[objeto nulo]"?typeof
la condición se usa para verificar el tipo de variable, si usted verifica el tipo de variable en la condición if-elsefuente