Pourquoi typeof array avec objets renvoie "Object" et non "Array"?

Duplication possible:
JavaScript: Vérifiez si l'objet est un tableau?

Pourquoi un ensemble 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

L'un des comportements et spécifications étranges dans Javascript est le typeof Array is 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]'; 

Puisque vous avez marqué votre question avec jQuery, vous pouvez utiliser jQuery isArray function:

 var isArr = $.isArray(data); 

Citer la spécification

15.4 Array Objects

Les objets Array apportent un traitement spécial à une certaine classe de noms de propriété. Un nom de propriété P (sous la forme d'une valeur String) 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 également appelé un élément. Chaque objet Array a une propriété de longueur dont la valeur est toujours un entier non négatif inférieur à 2 ^ 32. La valeur de la propriété length est numériquement supérieure au nom de chaque propriété dont le nom est un index de tableau; Chaque fois qu'une propriété d'un objet Array est créée ou modifiée, d'autres propriétés sont ajustées au besoin 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é de longueur est modifiée, si nécessaire, pour être supérieure à la valeur numérique de cet indice de tableau; Et chaque fois que la propriété de longueur est modifié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 s'applique uniquement aux propriétés propres à un objet Array et n'est pas affectée par la longueur ou les propriétés d'index de tableau qui peuvent être héritées de leurs prototypes.

Et voici une table pour typeof

Entrez la description de l'image ici


Pour ajouter du fond, il existe deux types de données en JavaScript:

  1. Types de données primitives : ceci inclut null, undefined, string, boolean, number and object.
  2. Types de données dérivées / Objets spéciaux – Ils comprennent des fonctions, des tableaux et des expressions régulières. Et oui, tous sont dérivés de "Object" en JavaScript.

Un objet en JavaScript est similaire en structure au tableau associatif / dictionnaire vu dans la plupart des langages orientés objet, c'est-à-dire qu'il a un ensemble de paires clé-valeur.

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

  1. Longueur – Cela peut être égal ou supérieur à 0 (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.

J'espère que cela a permis d'éclairer davantage pourquoi typeof Array renvoie un objet. À votre santé!

Essayez cet exemple et vous comprendrez également quelle est la différence b / w Associative Array and Object en JavaScript.

Tableau associatif

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

Renvoie true

Gardez à l'esprit que a.lenth sera indéfini, car la longueur est traitée comme une clé, vous devez utiliser Object.keys(a).length pour obtenir la longueur d'une matrice associative.

Objet

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

Renvoie false

JSON retourne et Object … pourrait renvoyer un tableau associatif … mais ce n'est pas comme ça

Il n'y a pas de tableau JS simple dans votre code. Les data sont un objet JS natif. Soyez conscient des différentes significations des différents types de parenthèses:

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