Pourquoi typeof array avec objects renvoie " Object "et non"Array"? [dupliquer]

possibilité de dupliquer:

JavaScript:vérifiez si l'objet est array?

pourquoi un tableau d'objets est-il considéré comme un objet, et non un tableau? Par exemple:

$.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
    }
});​

Violon

90
demandé sur Community 2012-10-21 14:05:04

4 réponses

L'un des comportements bizarres et spec en Javascript est le type de tableau est Object .

vous pouvez vérifier si la variable est un tableau de plusieurs façons:

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

Mais le moyen le plus fiable est:

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

depuis que vous avez étiqueté votre question avec jQuery, vous pouvez utiliser jQuery isArray fonction:

var isArr = $.isArray(data);
166
répondu gdoron 2012-10-21 10:11:49

citant le spec

15.4 Objets Array

les objets Array donnent un traitement spécial à une certaine classe de noms de propriétés. Un nom de propriété P(sous la forme d'une chaîne de valeur) est un index de tableau si et seulement si ToString(ToUint32(P)) est égal à P et ToUint32 (P) n'est pas égal à 2^32-1. Une propriété dont le nom de propriété est un index de tableau est aussi appelée un élément. Chaque objet Array a une propriété length dont la valeur est toujours nombre entier non négatif inférieur à 2^32. La valeur de la propriété length est numériquement plus grande que le nom de chaque propriété dont le nom est un index de tableau; chaque fois qu'une propriété d'un objet de tableau est créée ou changée, d'autres propriétés sont ajustées si nécessaire pour maintenir cet invariant. Plus précisément, chaque fois qu'une propriété est ajoutée dont le nom est un index de tableau, la propriété length est changée, si nécessaire, pour être une valeur numérique de plus de cet index de tableau; et chaque fois que la propriété length est changée, chaque propriété dont le nom est un index de tableau dont la valeur n'est pas inférieure à la nouvelle longueur est automatiquement supprimée. Cette contrainte ne s'applique qu'aux propriétés propres d'un objet Array et n'est pas affectée par les propriétés length ou array index qui peuvent être héritées de ses prototypes.

et voici un tableau pour typeof

enter image description here


ajouter quelques contexte, il existe deux types de données en JavaScript:

  1. types de Données Primitifs - Ce qui inclut null, undefined, chaîne, booléen, nombre et l'objet.
  2. types de données dérivées/objets spéciaux - ceux-ci comprennent les fonctions, les tableaux et les expressions régulières. Et oui, ils sont tous dérivés de "Objet" en JavaScript.

un objet en JavaScript est similaire en structure au tableau associatif / dictionnaire vu dans la plupart des langages orientés objet-i.e., il a un ensemble de paires de valeurs-clés.

un tableau peut être considéré comme un objet ayant les propriétés/clés suivantes:

  1. Length - cela peut être 0 ou plus (non négatif).
  2. Les indices de tableau . Par cela, je veux dire "0", "1", "2", etc sont toutes les propriétés de l'objet array.

Espère que cela a aidé à jeter plus de lumière sur pourquoi typeof Tableau renvoie un objet. Acclamations!

17
répondu Prinzhorn 2016-05-20 19:32:30

essayez cet exemple et vous comprendrez aussi Quelle est la différence entre le tableau associatif et L'objet en JavaScript.

Tableau Associatif

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

renvoie true

gardez à l'esprit que a.length ne sera pas défini, parce que length est traité comme une clé, vous devez utiliser Object.keys(a).length pour obtenir la longueur d'un tableau associatif.

Objet

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

renvoie false

JSON renvoie un objet ... pourrait retourner un Tableau Associatif ... mais ce n'est pas comme cela

4
répondu Reflective 2018-01-22 10:11:53

il n'y a pas de tableau JS dans votre code. Le data est un objet JS natif. Être conscient des différentes significations des différents types de crochets:

var someArray = [];
var someObject = {};
-5
répondu feeela 2012-10-21 10:09:33