La verificación de tipos de objetos en JS se realiza mediante instanceof
, es decir
obj instanceof Array
Esto no funcionará si el objeto pasa a través de los límites del marco, ya que cada marco tiene su propio Array
objeto. Puede solucionar este problema comprobando la propiedad [[Class]] interna del objeto. Para obtenerlo, utilice Object.prototype.toString()
(ECMA-262 garantiza que funciona):
Object.prototype.toString.call(obj) === '[object Array]'
Ambos métodos solo funcionarán para matrices reales y no para objetos similares a matrices como el arguments
objeto o las listas de nodos. Como todos los objetos tipo matriz deben tener una length
propiedad numérica , verificaría estos como este:
typeof obj !== 'undefined' && obj !== null && typeof obj.length === 'number'
Tenga en cuenta que las cadenas pasarán esta verificación, lo que podría generar problemas ya que IE no permite el acceso a los caracteres de una cadena por índice. Por lo tanto, es posible que desee cambiar typeof obj !== 'undefined'
a typeof obj === 'object'
para excluir primitivas y objetos host con tipos distintos de todos 'object'
juntos. Esto todavía permitirá que pasen los objetos de cadena, que deberían excluirse manualmente.
En la mayoría de los casos, lo que realmente desea saber es si puede iterar sobre el objeto mediante índices numéricos. Por lo tanto, podría ser una buena idea verificar si el objeto tiene una propiedad nombrada 0
en su lugar, lo que se puede hacer a través de una de estas verificaciones:
typeof obj[0] !== 'undefined' // false negative for `obj[0] = undefined`
obj.hasOwnProperty('0') // exclude array-likes with inherited entries
'0' in Object(obj) // include array-likes with inherited entries
La conversión a objeto es necesaria para que funcione correctamente para primitivas de tipo arreglo (es decir, cadenas).
Aquí está el código para comprobaciones sólidas para matrices JS:
function isArray(obj) {
return Object.prototype.toString.call(obj) === '[object Array]';
}
y objetos similares a matrices iterables (es decir, no vacíos):
function isNonEmptyArrayLike(obj) {
try { // don't bother with `typeof` - just access `length` and `catch`
return obj.length > 0 && '0' in Object(obj);
}
catch(e) {
return false;
}
}