2009-06-10 10 views
18

Angenommen, ich habe ein Javascript-Objekt, dasIterationsreihenfolge von for..in Schleifen in 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}; 

initialisiert und dann Objekte Ich möchte über die Schlüssel dieses iterieren

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

sowohl in Firefox 3 und Internet Explorer 8 werden die Objekte in der Reihenfolge iteriert, in der sie in der Objektdeklaration aufgelistet sind (q, t, o, b, y, etc).

Kann ich mich darauf verlassen? Angenommen, ich ändere mein Objekt vor der Iteration in keiner Weise. Ist es Teil des ECMAScript-Standards? Weiß jemand, welche Browser in der angegebenen Reihenfolge iterieren?

+3

Dup: http://StackOverflow.com/Questions/919027/are-Object-Variables-in-Javascript-Enumerated-in-the-order-they-Were-Added und http://StackOverflow.com/questions/280713/elements-order-for-in-loop-in-javascript –

Antwort

13

Nein, es kann nicht auf, zumindest not in Firefox verlassen:

A für ... in Schleife iteriert über die Eigenschaften eines Objekts in einer beliebigen Reihenfolge.

+2

Eigentlich kann man sich in Firefox darauf verlassen, aber nicht in Chrome; http://stackoverflow.com/questions/280713/elements-order-for-in-loop-in-javascript – doekman

+3

Sie sollten nicht auf eine reproduzierbare Reihenfolge in jedem Browser abhängen. Die Reihenfolge ist durch die aktuelle Implementierung gegeben, kann sich jedoch jederzeit ändern. Das verlinkte Dokument von Mozilla nennt die Reihenfolge explizit als beliebig. –

0

Nein, Sie sollten sich nicht darauf verlassen.

1

Die Reihenfolge ist in den Spezifikationen als "arbitrary" definiert, also nein; Sie sollten sich nicht darauf verlassen, dass die Reihenfolge definitiv ist.

2

Um eine bestimmte Reihenfolge für die Verarbeitung der Objekteigenschaften in einer For-In-Schleife sicherzustellen, müssen Sie eine Sortierreihenfolge oder Listenmethode für das Objekt definieren. Wenn Sie beim Erstellen des Objekts alle Eigenschaften definieren, reicht ein Array mit Eigenschaftsnamen aus. Wenn Sie jedoch Eigenschaften hinzufügen oder entfernen können, ist eine Methode erforderlich.

Wenn die Verarbeitungsreihenfolge aus irgendeinem Grund wichtig ist, kann ein Array vorzuziehen sein.