Qual é a melhor maneira de verificar se um objeto é um array ou não em JavaScript?
-
05-07-2019 - |
Pergunta
Say Eu tenho uma função assim:
function foo(bar) {
if (bar > 1) {
return [1,2,3];
} else {
return 1;
}
}
E dizer eu chamo foo(1)
, como eu sei que retorna um array ou não?
Solução
Eu uso essa função:
function isArray(obj) {
return Object.prototype.toString.call(obj) === '[object Array]';
}
é o caminho que jQuery.isArray é implementado.
Verifique este artigo:
Outras dicas
if(foo(1) instanceof Array)
// You have an Array
else
// You don't
Update: eu tenho que responder aos comentários feitos a seguir, porque as pessoas ainda estão alegando que isto não vai funcionar sem tentar isso por si ...
Para alguns outros objetos esta técnica não funciona (por exemplo, "" instanceof Cordas == false), mas isso funciona para Matriz. Eu testei no IE6, IE8, FF, Chrome e Safari. Experimente e veja por si mesmo antes de comentar abaixo.
Aqui está uma maneira muito confiável, tirar de Javascript: as partes boas, publicado pela O'Reilly:
if (my_value && typeof my_value === 'object' && typeof my_value.length === 'number' &&
!(my_value.propertyIsEnumerable('length')) { // my_value is truly an array! }
Eu sugeriria envolvê-lo em sua própria função:
function isarray(my_value) {
if (my_value && typeof my_value === 'object' && typeof my_value.length === 'number' &&
!(my_value.propertyIsEnumerable('length'))
{ return true; }
else { return false; }
}
Como de ES5 há isArray
.
Array.isArray([]) // true
Para tornar a sua solução mais geral, você pode não se importar se é realmente um objeto Array. Por exemplo, document.getElementsByName () retorna a um objecto que "actua como" uma matriz. "Cumprimento matriz" pode ser assumida se o objeto tem uma propriedade "comprimento".
function is_array_compliant(obj){
return obj && typeof obj.length != 'undefined';
}