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 = {};