web-dev-qa-db-fra.com

Pourquoi typeof array avec des objets renvoie "object" et non "array"?

Duplicate possible:
JavaScript: Vérifier si l'objet est un tableau?

Pourquoi un tableau d'objets est-il considéré comme un objet et non comme 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

115
Johan

L'un des comportements étranges et des spécifications en Javascript est le typeof Array is Object.

Vous pouvez vérifier si la variable est un tableau de plusieurs manières:

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 fonction:

var isArr = $.isArray(data);
206
gdoron

Citer la spec

15.4 Objets de tableau

Les objets de tableau accordent un traitement spécial à une certaine classe de noms de propriétés. 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ée 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 si nécessaire pour maintenir cet invariant. Spécifiquement, chaque fois qu'une propriété dont le nom est un index de tableau est ajoutée, la propriété de longueur est modifiée, si nécessaire, pour être une valeur de plus que la valeur numérique de cet index de tableau; et chaque fois que la propriété length 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 ne s'applique qu'aux propriétés propres d'un objet Array et n'est pas affectée par les propriétés de longueur ou d'index de tableau pouvant être héritées de ses prototypes.

Et voici une table pour typeof

enter image description here


Pour ajouter un peu d’arrière-plan, il existe deux types de données en JavaScript:

  1. types de données primitives - Ceci inclut les valeurs null, indéfini, chaîne, booléen, nombre et objet.
  2. Types de données dérivés/Objets spéciaux - Ceux-ci incluent des fonctions, des tableaux et des expressions régulières. Et oui, ils sont tous dérivés de "Object" en JavaScript.

Un objet en JavaScript a une structure similaire à celle du tableau/dictionnaire associatif utilisé dans la plupart des langages orientés objet - c’est-à-dire qu’il possède 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 à 0 ou supérieur (non négatif).
  2. Les indices du tablea. Par cela, je veux dire "0", "1", "2", etc. sont toutes les propriétés d'un objet tableau.

J'espère que cela a permis de mieux comprendre pourquoi typeof Array renvoie un objet. À votre santé!

23
Prinzhorn

Essayez cet exemple et vous comprendrez aussi quelle est la différence entre un tableau associatif et un objet en JavaScript.

tableau associatif

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

retourne true

Gardez à l'esprit que a.length Ne sera pas défini, car length étant 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)

retourne false

JSON retourne un objet ... pourrait retourner un tableau associatif ... mais ce n'est pas comme ça

6
Reflective