61 votes

Longueur de tableau Javascript incorrecte sur un tableau d'objets

Quelqu'un pourrait-il expliquer ce comportement (étrange)? Pourquoi la longueur dans le premier exemple 3 et non 2 et, plus important encore, pourquoi la longueur dans le deuxième exemple 0? Tant que les touches sont numériques, la longueur fonctionne. Quand ils ne le sont pas, la longueur est 0. Comment puis-je obtenir la longueur correcte du deuxième exemple? Je vous remercie.

 a = [];
a["1"] = {"string1":"string","string2":"string"};
a["2"] = {"string1":"string","string2":"string"};
alert(a.length); // returns 3

b = [];
b["key1"] = {"string1":"string","string2":"string"};
b["key2"] = {"string1":"string","string2":"string"};
alert(b.length); // returns 0
 

97voto

The Code Pimp Points 713

Une chose à noter est qu'il existe une différence entre les tableaux et les tableaux associatifs. En rangées régulières (réel des tableaux), l'index doit être un nombre entier. En revanche, les tableaux associatifs peuvent utiliser les chaînes de caractères comme un indice. Vous pouvez penser à des tableaux associatifs comme une carte, si vous le souhaitez. Maintenant, notez également, véritables tableaux de toujours recommencer à partir de zéro. Ainsi, dans votre exemple, vous avez créé un tableau de la manière suivante:

a = [];
a["1"] = {"string1":"string","string2":"string"};
a["2"] = {"string1":"string","string2":"string"}

Javascript a été en mesure de convertir votre index de chaînes de caractères en nombres, par conséquent, votre code ci-dessus devient:

a = [];
a[1] = {"blah"};
a[2] = {"blah"};

Mais rappelez-vous ce que j'ai dit précédemment: de Vrais tableaux de commencer à partir de zéro. Par conséquent, l'interpréteur javascript automatiquement attribué un[0] à l'indéfini. Essayer dans firebug ou chrome/safari console, et vous verrez quelque chose comme ceci lorsque vous essayez d'imprimer "un". Vous devriez obtenir quelque chose comme "[non défini, l'Objet, l'Objet]. Donc la taille 3 et non pas 2 comme prévu.

Dans ton deuxième exemple, je suis sûr que vous êtes en essayant de simuler l'utilisation d'un tableau associatif, dont l'essentiel est l'ajout de propriétés à un objet. Rappelez-vous associé les tableaux vous permettent d'utiliser les chaînes de caractères comme une clé. Donc, en d'autres termes, vous ajoutez une propriété de l'objet. Donc dans votre exemple:

b["key1"] = {"string1":"string","string2":"string"};

cela signifie réellement:

b.key1 = {"string1":"string","string2":"string"};

L'initialisation b =[] crée simplement un tableau, mais votre mission ne pas remplir le tableau. Il donne simplement des "b" des propriétés supplémentaires. Espérons que cela aide.. :-)

19voto

Itay Maman Points 15470

length renvoie 1 + la plus grande clé entière de l'objet.

En a la plus grande clé est 2, donc 1 + 2 est 3.

Dans b il n'y a pas de clé entière (les clés qui y sont référencées sont des key1 et key2 qui ne peuvent pas être converties en ints), donc Javascript suppose que la plus grande clé est -1 , et 1 + -1 donne 0 .

Ce programme vous aidera à voir que:

 a = [];
a["1"] = {};
a["4"] = {};
alert(a.length); // Prints 5
 

9voto

outis Points 39377

À partir de l'ECMAScript standard ECMA-262, 5e ed.

15.4.5.2 longueur

La longueur de la propriété de cet objet Array est une propriété de données dont la valeur est toujours numériquement plus élevé que le nom de chaque deletable de la propriété dont le nom est un tableau d'index.

Remarque la propriété length d'un tableau ne prend en compte que les index de tableau, qui sont des nombres entiers; définir d'autres propriétés n'affecte pas la longueur.

Pour un tableau, a["3"] est équivalent à a[3] (ce comportement est spécifié par le § 15.4.5.1); 3 est un tableau d'index plutôt qu'un bien. Ainsi, a["3"] affecte la longueur du tableau. b["key1"] est équivalent à b.key1. Définition des propriétés n'a pas d'incidence sur la durée d'une collection.

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