2009-03-15 6 views
16

in PHP, wenn Sie den folgenden Code haben:Ist die Reihenfolge der Felder in einem JavaScript-Objekt vorhersagbar, wenn sie durchlaufen werden?

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

$map["third"] = 3; 

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

Sie wissen, dass die Einträge in der Reihenfolge aufgeführt werden, werden sie zu dem Array hinzugefügt wurden.

Nun kann ich davon ausgehen, die gleiche Regel gilt für die Javascript-Entsprechung unten?

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

map["third"] = 3; 

for (key in map) { 
    // code 
} 

Dies ist ein Duplikat: Elements order - for (… in …) loop in javascript

+0

mögliche Duplikate von [Elemente Reihenfolge - für (... in ...) Schleife in Javascript] (http://StackOverflow.com/Questions/280713/Elements-Order-for-in-Loop-in-Javascript) – Borgar

Antwort

10

Die meisten Browser durchlaufen die Eigenschaften in der Reihenfolge, in der sie dem Objekt hinzugefügt wurden, aber der JavaScript-Standard sagt, dass die Reihenfolge nicht definiert ist - Sie sollten sich also nicht auf dieses Verhalten verlassen. Ich lese zum Beispiel eine blog post vor einiger Zeit darüber, wie Google Chrome dieses Verhalten nicht immer zeigte.

Wenn Sie die bestellte Funktionalität benötigen, sollten Sie eine neue Klasse für sich selbst erstellen, die sowohl Objekt- als auch numerische Schlüssel verwenden kann.

+1

Vielen Dank für den Link. Was John sagt, ist, dass, obwohl es nicht Standard ist, Browser-Anbieter es anwenden, als ob es war (also wird das Chrome-Team den "Fehler" beheben). –

+1

Yup. Obwohl ich immer noch nicht denke, dass du dich auf das Verhalten verlassen solltest. Sicherer erstellen Sie einfach eine benutzerdefinierte Klasse, wo Sie das Verhalten selbst definieren können. –

0

Nein, das Verhalten bei der Umsetzung abhängt, und es ist nicht garantiert. Verwenden Sie ein Array, wenn die Reihenfolge beibehalten werden soll.

+1

Ja aber (im Standard): "Die Mechanik der Aufzählung der Eigenschaften (Schritt 5 im ersten Algorithmus, Schritt 6 im zweiten) ist implementierungsabhängig. Die Reihenfolge der Aufzählung wird durch das Objekt definiert." Also Enumeration selbst ist implementation abhängig, aber die Reihenfolge ist objektabhängig, nein? –

+1

@Julian: Die nächste Ausgabe 3.1 von ECMA-262 ist weniger zweideutig: "Die Mechanik und Reihenfolge der Aufzählung der Eigenschaften [...] ist nicht spezifiziert." – Christoph