La boucle "for… in" en Javascript parcourt-elle les tables de hachage / éléments dans l'ordre dans lequel elles sont déclarées? Y a-t-il un navigateur qui ne le fait pas dans l'ordre?
L'objet que je souhaite utiliser sera déclaré une fois et ne sera jamais modifié.
Supposons que j'ai:
var myObject = { A: "Hello", B: "World" };
Et je les utilise en outre dans:
for (var item in myObject) alert(item + " : " + myObject[item]);
Puis-je m'attendre à ce que 'A: "Bonjour"' apparaisse toujours avant 'B: "Monde"' dans la plupart des navigateurs décents?
javascript
for-loop
chakrit
la source
la source
Réponses:
Citant John Resig :
Tous les navigateurs respectent l'ordre de définition à l'exception de Chrome et Opera qui le font pour chaque nom de propriété non numérique. Dans ces deux navigateurs, les propriétés sont extraites dans l'ordre avant la première propriété non numérique (cela a à voir avec la façon dont elles implémentent les tableaux). L'ordre est également le même pour
Object.keys
.Cet exemple devrait montrer clairement ce qui se passe:
Les détails techniques sont moins importants que le fait que cela puisse changer à tout moment. Ne comptez pas sur des choses qui restent ainsi.
En bref: utilisez un tableau si l'ordre est important pour vous.
la source
Cogner un an plus tard ...
Nous sommes en 2012 et les principaux navigateurs diffèrent encore :
essentiel ou test dans le navigateur actuel
Safari 5, Firefox 14
Chrome 21, Opera 12, Node 0.6, Firefox 27
IE9
la source
delete
est intéressant car au moins en V8, il provoque instantanément la sauvegarde de l'objet par une table de hachage. Cependant, la table de hachage dans V8 stocke dans l'ordre d'insertion. Le résultat le plus intéressant ici est IE, je me demande quel genre de laideur ils font pour yD'après la spécification du langage ECMAScript , section 12.6.4 (sur le
for .. in
boucle):Et la section 4.3.3 (définition d '"objet"):
Je suppose que cela signifie que vous ne pouvez pas compter sur les propriétés énumérées dans un ordre cohérent entre les implémentations JavaScript. (Ce serait de toute façon un mauvais style de s'appuyer sur des détails spécifiques à l'implémentation d'un langage.)
Si vous voulez que votre commande soit définie, vous devrez implémenter quelque chose qui la définit, comme un tableau de clés que vous triez avant d'accéder à l'objet avec.
la source
Les éléments d'un objet qui pour / in énumèrent sont les propriétés qui n'ont pas l'indicateur DontEnum défini. La norme ECMAScript, alias Javascript, dit explicitement qu '"un objet est une collection non ordonnée de propriétés" (voir http://www.mozilla.org/js/language/E262-3.pdf section 8.6).
Il ne sera pas conforme aux normes (c'est-à-dire sûr) de supposer que toutes les implémentations Javascript seront énumérées dans l'ordre de déclaration.
la source
L'ordre d'itération est également confondu en ce qui concerne la suppression des propriétés, mais dans ce cas avec IE uniquement.
Le désir de changer la spécification pour corriger l'ordre d'itération semble être un désir assez populaire parmi les développeurs si la discussion sur http://code.google.com/p/v8/issues/detail?id=164 est une indication.
la source
dans IE6, la commande n'est pas garantie.
la source
La commande n'est pas fiable. Opera et Chrome renvoient la liste des propriétés non ordonnées.
Le code ci-dessus montre B, A, C dans Opera et C, A, B dans Chrome.
la source
Cela ne répond pas à la question en soi, mais offre une solution au problème de base.
En supposant que vous ne pouvez pas compter sur l'ordre pour le conserver, pourquoi ne pas utiliser un tableau d'objets avec la clé et la valeur comme propriétés?
Maintenant, c'est à vous de vous assurer que les clés sont uniques (en supposant que cela est également important pour vous. De même, les changements d'adressage direct, et pour (... dans ...) renvoie maintenant les index en tant que «clés».
Voir le Pen pour (... dans ...) l'adressage par JDQ ( @JDQ ) sur CodePen .la source