227 votes

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

Duplicata 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

334voto

gdoron Points 61066

L'un des comportements étranges et la spécification en Javascript est que le typeof Array 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]';

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

var isArr = $.isArray(data);

37voto

Prinzhorn Points 7336

Citation de la spécification

15.4 Objets de type tableau

Les objets de type tableau accordent un traitement spécial à une certaine catégorie de noms de propriétés. Un nom de propriété P (sous la forme d'une valeur String) est un indice 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 indice de tableau est également appelée un élément. Chaque objet Array possède une propriété length dont la valeur est toujours un nombre 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 indice de tableau ; chaque fois qu'une propriété d'un objet Array est créée ou modifiée, les autres propriétés sont ajustées si nécessaire pour maintenir cet invariant. Plus précisément, chaque fois qu'une propriété dont le nom est un indice de tableau est ajoutée, la propriété length est modifiée, si nécessaire, pour être supérieure d'une unité à la valeur numérique de cet indice de tableau ; et chaque fois que la propriété length est modifiée, chaque propriété dont le nom est un indice de tableau et 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 d'un objet Array et n'est pas affectée par les propriétés de longueur ou d'indice de tableau qui peuvent être héritées de ses prototypes.

Et voici un tableau pour typeof

enter image description here


Pour ajouter un peu de contexte, il existe deux types de données en JavaScript :

  1. Types de données primitives - Cela inclut null, undefined, string, boolean, number et object.
  2. Types de données dérivées/Objets spéciaux - Il s'agit notamment des fonctions, des tableaux et des expressions régulières. Et oui, tous ces éléments sont dérivés du mot "Object" en JavaScript.

La structure d'un objet en JavaScript est similaire à celle d'un tableau associatif ou d'un dictionnaire dans la plupart des langages orientés objet, c'est-à-dire qu'il comporte un ensemble de paires clé-valeur.

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

  1. Longueur - Cette valeur peut être égale ou supérieure à 0 (non négatif).
  2. Les indices du tableau . J'entends par là que "0", "1", "2", etc. sont toutes des propriétés de l'objet tableau.

J'espère que cela a permis de mieux comprendre pourquoi typeof Array renvoie un objet. A la vôtre !

8voto

Reflective Points 1587

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);

renvoie à true

Gardez à l'esprit que a.length sera indéfini, car 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 renvoyer un tableau associatif ... mais ce n'est pas le cas.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X