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
}
});
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);
Citer la spec
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
Pour ajouter un peu d’arrière-plan, il existe deux types de données 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:
J'espère que cela a permis de mieux comprendre pourquoi typeof Array renvoie un objet. À votre santé!
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