¿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.nlugar del nombre original esperado. por ejemplo,constructor.namepodría darte ennlugar 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
ActiveXObjectInstancias 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.\wpalabra 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.callfuente
namees una extensión de ECMAScript y no funcionará en todos los navegadores.constructor.namees probable que termine siendo algo así comonel nombre de objeto que espera. Así que ten cuidado con eso, especialmente si solo minimizas la producción.nullyundefineddesafortunadamente 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
TYPESobjeto. Tengatypeof HTMLElementCollectionen cuenta que en Safari informaráfunction, pero el tipo (HTMLElementCollection) devolveráobjectfuente
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())//promisetypeOf(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.toStringa 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 onesolució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 variablesthiscon 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á[objecty 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
undefinedynullprimero, luego simplemente llamarconstructor.name.toLowerCase().fuente
.constructor.namesiempre contiene el valor de la cadena. Para undefined / null tenemos las cadenas apropiadas devueltas por la función.constructores 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]"?typeofla condición se usa para verificar el tipo de variable, si usted verifica el tipo de variable en la condición if-elsefuente