Por que o array typeof com objects retorna “Object” e não “Array”?

Duplicar Possível:
JavaScript: Verifique se o object é array?

Por que uma matriz de objects é considerada um object e não uma matriz? Por exemplo:

$.ajax({ url: 'http://api.twitter.com/1/statuses/user_timeline.json', data: { screen_name: 'mick__romney'}, dataType: 'jsonp', success: function(data) { console.dir(data); //Array[20] alert(typeof data); //Object } });​ 

Violino

Um dos comportamentos estranhos e especificações em Javascript é o tipo de Array is Object .

Você pode verificar se a variável é um array de duas maneiras:

 var isArr = data instanceof Array; var isArr = Array.isArray(data); 

Mas a maneira mais confiável é:

 isArr = Object.prototype.toString.call(data) == '[object Array]'; 

Desde que você marcou sua pergunta com jQuery, você pode usar a function jQuery isArray :

 var isArr = $.isArray(data); 

Citando a especificação

15.4 Objetos de Matriz

Objetos de matriz dão tratamento especial a uma determinada class de nomes de propriedade. Um nome de propriedade P (na forma de um valor String) é um índice de matriz se e somente se ToString (ToUint32 (P)) for igual a P e ToUint32 (P) não for igual a 2 ^ 32-1. Uma propriedade cujo nome de propriedade é um índice de matriz também é chamado de elemento. Todo object Array possui uma propriedade length cujo valor é sempre um inteiro não negativo menor que 2 ^ 32. O valor da propriedade length é numericamente maior que o nome de cada propriedade cujo nome é um índice de array; sempre que uma propriedade de um object Array é criada ou alterada, outras propriedades são ajustadas conforme necessário para manter essa invariante. Especificamente, sempre que uma propriedade é adicionada cujo nome é um índice de matriz, a propriedade length é alterada, se necessário, para ser um a mais que o valor numérico desse índice de matriz; e sempre que a propriedade length for alterada, todas as propriedades cujo nome é um índice de array cujo valor não seja menor que o novo tamanho serão excluídas automaticamente. Essa restrição aplica-se apenas às propriedades próprias de um object Array e não é afetada por propriedades de comprimento ou índice de matriz que podem ser herdadas de seus protótipos.

E aqui está uma tabela para typeof

insira a descrição da imagem aqui


Para adicionar alguns antecedentes, existem dois tipos de dados em JavaScript:

  1. Tipos primitivos de dados – Isso inclui null, undefined, string, boolean, number e object.
  2. Tipos de dados derivados / Objetos Especiais – Incluem funções, matrizes e expressões regulares. E sim, todos são derivados de “Objeto” em JavaScript.

Um object em JavaScript é semelhante em estrutura ao array / dictionary associativo visto na maioria das linguagens orientadas a object – isto é, ele tem um conjunto de pares de valores-chave.

Uma matriz pode ser considerada um object com as seguintes propriedades / chaves:

  1. Comprimento – Isso pode ser 0 ou acima (não negativo).
  2. Os índices da matriz . Por isso, quero dizer “0”, “1”, “2”, etc são todas as propriedades do object da matriz.

Espero que isso tenha ajudado a esclarecer por que typeof Array retorna um object. Felicidades!

Tente este exemplo e você também entenderá qual é a diferença entre Matriz Associativa e Objeto em JavaScript.

Matriz Associativa

 var a = new Array(1,2,3); a['key'] = 'experiment'; Array.isArray(a); 

retorna true

Tenha em mente que a.length será indefinido, porque length é tratado como uma chave, você deve usar Object.keys(a).length para obter o comprimento de uma Matriz Associativa.

Objeto

 var a = {1:1, 2:2, 3:3,'key':'experiment'}; Array.isArray(a) 

retorna false

JSON retorna um object … poderia retornar uma matriz associativa … mas não é assim

Não há nenhum array JS simples em seu código. Os data são um object JS nativo. Esteja ciente dos diferentes significados dos diferentes tipos de chaves:

 var someArray = []; var someObject = {};