2009-03-15 6 views
16

en php, si vous avez le code suivant:L'ordre des champs dans un objet javascript est-il prévisible lors de leur lecture en boucle?

$map = array(
    "first" => 1, 
    "second" => 2 
); 

$map["third"] = 3; 

foreach($map as $key => $value) { 
    // code 
} 

Vous connaissez les entrées seront répertoriées dans l'ordre dans lequel ils ont été ajoutés au tableau. Maintenant, est-ce que je peux supposer que la même règle s'applique à l'équivalent Javascript ci-dessous?

map = { 
    "first": 1, 
    "second": 2 
}; 

map["third"] = 3; 

for (key in map) { 
    // code 
} 

C'est un double de: Elements order - for (… in …) loop in javascript

+0

duplication possible de [Eléments order - for (... in ...) loop in javascript] (http://stackoverflow.com/questions/280713/elements-order-for-in-loop-in-javascript – Borgar

Répondre

10

La plupart des navigateurs parcourront les propriétés dans l'ordre dans lequel elles ont été ajoutées à l'objet, mais la norme Javascript indique que la commande n'est pas définie - vous ne devriez donc pas vous fier à ce comportement. Par exemple, j'ai lu un blog post il y a un certain temps sur la façon dont Google Chrome ne présentait pas toujours ce comportement.

Si vous avez besoin de la fonctionnalité commandée, vous devez créer une nouvelle classe pour vous-même qui peut utiliser à la fois des clés numériques ou des objets.

+1

Merci beaucoup pour le lien. Ce que John dit est que, bien que ce ne soit pas standard, les vendeurs de navigateurs l'appliquent comme si c'était le cas (ainsi l'équipe de Chrome corrigera le "bug"). –

+1

Yup. Bien que je ne pense toujours pas que vous devriez compter sur le comportement. Plus sûr de créer simplement une classe personnalisée où vous pouvez définir le comportement vous-même. –

0

Non, le comportement dépend de la mise en œuvre et il est pas garanti. Utilisez un tableau lorsque l'ordre doit être conservé.

+1

Oui mais (dans la norme): "La mécanique de l'énumération des propriétés (étape 5 dans le premier algorithme, étape 6 dans la seconde) est dépendante de l'implémentation.L'ordre d'énumération est défini par l'objet." L'énumération elle-même dépend de l'implémentation, mais l'ordre dépend de l'objet, non? –

+1

@Julian: la prochaine édition 3.1 de ECMA-262 est moins ambiguë: "La mécanique et l'ordre d'énumération des propriétés [...] n'est pas spécifié." – Christoph