El typeof
operador realmente no nos ayuda a encontrar el tipo real de un objeto.
Ya he visto el siguiente código:
Object.prototype.toString.apply(t)
Pregunta:
¿Es la forma más precisa de verificar el tipo de objeto?
javascript
Royi Namir
fuente
fuente
Respuestas:
La especificación de JavaScript proporciona exactamente una forma adecuada de determinar la clase de un objeto:
http://bonsaiden.github.com/JavaScript-Garden/#types
fuente
Object.prototype.toString.call(new FormData()) === "[object FormData]"
que sería cierto. También puede usarslice(8, -1)
para regresar enFormData
lugar de[object FormData]
Object.prototype
y{}
?Object.prototype.toString.call(new MyCustomObject())
vuelve[object Object]
mientrasnew MyCustomObject() instanceOf MyCustomObject returns true
que es lo que quería (Chrome 54.0.2840.99 m)new MyCustomObject().constructor === MyCustomObject
.el
Object.prototype.toString
es una manera buena, pero su rendimiento es el peor.http://jsperf.com/check-js-type
Use
typeof
para resolver algún problema básico (String, Number, Boolean ...) y useObject.prototype.toString
para resolver algo complejo (como Array, Date, RegExp).y esta es mi solución:
usar como:
fuente
type
función es buena, pero observe cómo funciona en comparación con otrastype
funciones. http://jsperf.com/code-type-test-a-test({}).toString.call(obj)
es más lento queObject.prototype.toString
jsperf.com/object-check-test77La respuesta aceptada es correcta, pero me gusta definir esta pequeña utilidad en la mayoría de los proyectos que construyo.
Usado así:
Si está usando angular, incluso puede inyectarlo limpiamente:
fuente
Controle el prototipo que espera que tenga el objeto y luego compárelo con él.
por ejemplo
fuente
o instanceof String; //true
?"foo" instanceof String
rompetypeof(x)==='string'
úsalas.Object.getPrototypeOf(true)
falla donde(true).constructor
vuelveBoolean
.Yo diría que la mayoría de las soluciones que se muestran aquí sufren de ingeniería excesiva. Probablemente la forma más simple de verificar si un valor es de tipo
[object Object]
es verificar la.constructor
propiedad del mismo:o incluso más corto con funciones de flecha:
La
a != null
parte es necesaria porque uno puede pasarnull
oundefined
no puede extraer una propiedad de constructor de ninguno de estos.Funciona con cualquier objeto creado a través de:
Object
constructor{}
Otra característica interesante es su capacidad de proporcionar informes correctos para las clases personalizadas que utilizan
Symbol.toStringTag
. Por ejemplo:El problema aquí es que cuando se llama
Object.prototype.toString
a una instancia,[object Object]
se devolverá el informe falso :Pero verificar contra el constructor da un resultado correcto:
fuente
La mejor manera de averiguar el tipo REAL de un objeto (incluyendo AMBOS el nombre del objeto nativo o del tipo de datos (como String, Date, Number, ..etc) Y el tipo REAL de un objeto (incluso los personalizados); es agarrando La propiedad de nombre del constructor del prototipo de objeto:
Tipo nativo Ex1:
muestra:
Ex2:
muestra:
Clases personalizadas:
muestra:
fuente
null
oundefined
.Antigua pregunta que sé. No necesitas convertirlo. Ver esta función:
Ejemplos:
Bajo costo y simple.
fuente
false
si el objeto de prueba esnull
oundefined
true
ofalse
false
. ¿Cómo ayuda esto a responder la pregunta?Reuní una pequeña utilidad de verificación de tipo inspirada en las respuestas correctas anteriores:
ejemplo:
fuente
null
oundefined
otrue
ofalse