Como verificar se um objeto é um array em JavaScript: 3 melhores maneiras

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Como verificar se um objeto é um array em JavaScript: guia completo

\n\n

Você já se pegou pensando: "Achei que tinha passado um array, mas o código está dando erro"? Situação familiar. Em JavaScript, arrays são objetos, e a simples verificação com typeof não funciona aqui. Hoje vamos analisar três maneiras principais de verificar se um objeto é um array e descobrir qual delas vale a pena usar em projetos reais.

\n\n

Por que o typeof não é adequado?

\n\n

Antes de mergulharmos nos detalhes, vamos entender por que os iniciantes frequentemente tropeçam nesse ponto. Em JavaScript, arrays são um caso especial de objetos. Portanto, o operador typeof para um array retornará "object", e não "array". Experimente você mesmo:

\n\n
const arr = [1, 2, 3];\nconsole.log(typeof arr); // "object" — inútil
\n\n

Além disso, typeof null === "object" — este é um bug conhecido da linguagem que não será corrigido. Então, se você está verificando dados do usuário ou de uma API, não pode confiar em typeof. São necessários métodos mais confiáveis.

\n\n

Método 1: Array.isArray() — o padrão moderno

\n\n

A partir do ES5 (2009), o JavaScript introduziu o método nativo Array.isArray(). Esta é a maneira mais correta e simples de verificar se um objeto é um array.

\n\n
const arr = [10, 20, 30];\nconst notArr = { length: 3, 0: 'a', 1: 'b', 2: 'c' };\n\nconsole.log(Array.isArray(arr));    // true\nconsole.log(Array.isArray(notArr)); // false\nconsole.log(Array.isArray('hello')); // false\nconsole.log(Array.isArray(null));    // false
\n\n

Por que esta é a melhor escolha? Porque Array.isArray() funciona corretamente mesmo em cenários complexos: se o array veio de outro iframe ou frame, o instanceof pode falhar, mas o Array.isArray() não. Ele verifica o tipo interno [[Class]] do objeto, não a cadeia de protótipos.

\n\n

Suporte a navegadores

\n

O método é suportado por todos os navegadores modernos, incluindo Internet Explorer 9+. Se você precisar suportar navegadores muito antigos (IE 8 e inferiores), use um polyfill ou o terceiro método.

\n\n

Método 2: instanceof Array — o clássico

\n\n

O operador instanceof verifica se o protótipo Array.prototype está presente na cadeia de protótipos do objeto. Parece complicado, mas na prática funciona assim:

\n\n
const arr = [1, 2, 3];\nconsole.log(arr instanceof Array); // true\n\nconst obj = { a: 1 };\nconsole.log(obj instanceof Array); // false\n\n// E aqui está a surpresa:\nconst iframeArr = new iframe.contentWindow.Array(1, 2, 3);\nconsole.log(iframeArr instanceof Array); // false! (se o array for de outro frame)
\n\n

Aí está o problema: se você tem vários iframes na página ou trabalha com Web Workers, arrays de diferentes contextos globais têm protótipos diferentes. O instanceof não leva isso em conta e pode retornar false para um array verdadeiro. Portanto, no desenvolvimento moderno, é melhor evitar o instanceof para verificar arrays.

\n\n

Método 3: Object.prototype.toString.call() — o soldado universal

\n\n

Este método era usado antes do surgimento do Array.isArray(). Ele ainda é relevante se você precisar escrever um polyfill ou trabalhar em um ambiente onde Array.isArray não está disponível.

\n\n
function isArray(obj) {\n  return Object.prototype.toString.call(obj) === '[object Array]';\n}\n\nconsole.log(isArray([1, 2]));      // true\nconsole.log(isArray({ a: 1 }));    // false\nconsole.log(isArray('string'));    // false\nconsole.log(isArray(null));        // false
\n\n

Como funciona? O método toString do objeto Object.prototype retorna uma string no formato [object Type]. Para arrays, isso é sempre [object Array]. Este método contorna o problema dos iframes porque verifica o interno

Blogs

Book Recommendations