2009-06-10 8 views
18

Supposons que j'ai un objet Javascript qui est initialiséIteration ordre de boucles for..in en Javascript

var letters = {q:0, t:0, o:0, b:0, y:0, n:0, u:0, m:0, p:0, 
       w:0, a:0, d:0, k:0, v:0, c:0, z:0, l:0, j:0, 
       i:0, e:0, g:0, s:0, x:0, r:0, h:0, f:0}; 

et je veux itérer les clés de ce objets

for(var letter in letters) { 
    // code goes here 
} 

Dans les deux Firefox 3 et Internet Explorer 8 les objets sont itérés dans l'ordre dans lequel ils sont listés dans la déclaration d'objet (q, t, o, b, y, etc.).

Puis-je me fier à cela? Supposons que je ne modifie aucunement mon objet avant l'itération. Fait-il partie de la norme ECMAScript? Est-ce que quelqu'un sait quels navigateurs parcourent dans l'ordre déclaré?

+3

Dup: http://stackoverflow.com/questions/919027/are-object-variables-in-javascript-enumerated-in-the-order-they-were-added et http://stackoverflow.com/questions/280713/elements-order-for-in-loop-in-javascript –

Répondre

13

Non, il ne peut pas être invoqué, au moins not in Firefox:

A ... dans une itération de boucle sur les propriétés d'un objet dans un ordre arbitraire.

+2

En fait, dans Firefox, vous pouvez compter sur cela, mais pas sur Chrome; voir http://stackoverflow.com/questions/280713/elements-order-for-in-loop-in-javascript – doekman

+3

Vous ne devriez pas dépendre d'une commande reproductible dans n'importe quel navigateur. La commande est donnée par l'implémentation en cours mais peut changer à tout moment. Le document lié par Mozilla appelle explicitement l'ordre arbitraire. –

0

Non, vous ne devriez pas compter sur cela.

1

L'ordre est défini dans les spécifications comme "arbitraire", donc non; vous ne devriez pas compter sur l'ordre étant défini.

2

Pour garantir un ordre particulier de traitement des propriétés d'un objet dans une boucle for-in, vous devez définir un ordre de tri ou une méthode de liste pour l'objet. Si vous définissez toutes les propriétés lorsque vous créez l'objet, un tableau de noms de propriété le fera, mais si vous pouvez ajouter ou supprimer des propriétés, une méthode est requise.

Si l'ordre de traitement est essentiel pour une raison quelconque, un ensemble peut être préférable.

Questions connexes