A verificação de tipo de objetos em JS é feita via instanceof
, ou seja,
obj instanceof Array
Isso não funcionará se o objeto for passado pelos limites do quadro, pois cada quadro tem seu próprio Array
objeto. Você pode contornar isso verificando a propriedade interna [[Class]] do objeto. Para obtê-lo, use Object.prototype.toString()
(é garantido que funcione pela ECMA-262):
Object.prototype.toString.call(obj) === '[object Array]'
Ambos os métodos funcionarão apenas para arrays reais e não para objetos do tipo array, como o arguments
objeto ou listas de nós. Como todos os objetos em forma de matriz devem ter uma length
propriedade numérica , eu verificaria assim:
typeof obj !== 'undefined' && obj !== null && typeof obj.length === 'number'
Observe que as strings passarão nesta verificação, o que pode causar problemas, pois o IE não permite acesso aos caracteres de uma string por índice. Portanto, você pode querer alterar typeof obj !== 'undefined'
para typeof obj === 'object'
para excluir primitivos e objetos de host com tipos diferentes de todos 'object'
juntos. Isso ainda permitirá a passagem de objetos de string, que teriam que ser excluídos manualmente.
Na maioria dos casos, o que você realmente deseja saber é se pode iterar sobre o objeto por meio de índices numéricos. Portanto, pode ser uma boa ideia verificar se o objeto tem uma propriedade chamada 0
, o que pode ser feito por meio de uma destas verificações:
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
A conversão para o objeto é necessária para funcionar corretamente para primitivos do tipo array (ou seja, strings).
Este é o código para verificações robustas para matrizes JS:
function isArray(obj) {
return Object.prototype.toString.call(obj) === '[object Array]';
}
e objetos semelhantes a array iteráveis (ou seja, não vazios):
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;
}
}