Ab ES2015 ist die Reihenfolge der Eigenschaften für bestimmte Methoden, die über Eigenschaften iterieren, garantiert. aber nicht andere . Leider sind die Methoden, bei denen eine Ordnung nicht garantiert ist, im Allgemeinen die am häufigsten verwendeten:
Object.keys
, Object.values
, Object.entries
for..in
Schleifen
JSON.stringify
Aber ab ES2020 ist die Eigentumsordnung für diese bisher nicht vertrauenswürdigen Methoden se durch die Spezifikation gewährleistet sein auf dieselbe deterministische Art und Weise wie die anderen zu iterieren, und zwar aufgrund der Tatsache, dass fertig Vorschlag: Einfahrmechanik .
Genau wie bei den Methoden, die eine garantierte Iterationsreihenfolge haben (wie Reflect.ownKeys
y Object.getOwnPropertyNames
), werden die zuvor nicht spezifizierten Methoden ebenfalls in der folgenden Reihenfolge durchlaufen:
- Numerische Feldschlüssel, in aufsteigender numerischer Reihenfolge
- Alle anderen Tasten, die keine Symboltasten sind, in Einfügereihenfolge
- Symboltasten, in Einfügereihenfolge
Dies ist bei so gut wie jeder Umsetzung der Fall (und das schon seit vielen Jahren), aber mit dem neuen Vorschlag ist es nun offiziell.
Obwohl die aktuelle Spezifikation für in Iterationsreihenfolge " fast völlig unbestimmt Echte Motoren sind in der Regel beständiger:"
Der Mangel an Spezifität in ECMA-262 spiegelt nicht die Realität wider. In jahrelangen Diskussionen haben die Implementierer festgestellt, dass es einige Einschränkungen für das Verhalten von for-in gibt, die jeder befolgen muss, der Code im Web ausführen möchte.
Da jede Implementierung bereits vorhersehbar über Eigenschaften iteriert, kann sie in die Spezifikation aufgenommen werden, ohne die Abwärtskompatibilität zu verletzen.
Es gibt ein paar merkwürdige Fälle, die derzeit umgesetzt werden no und in solchen Fällen wird die sich daraus ergebende Reihenfolge weiterhin unbestimmt sein. Für die Eigentumsordnung zu gewährleisten :
Weder das Objekt, das iteriert wird, noch irgendetwas in seiner Prototypenkette ist ein Proxy, ein typisiertes Array, ein Modul-Namespace-Objekt oder ein exotisches Host-Objekt.
Weder das Objekt noch irgendetwas in seiner Prototypenkette ändert seinen Prototyp während der Iteration.
Weder das Objekt noch irgendetwas in seiner Prototypenkette hat eine Eigenschaft, die während der Iteration gelöscht wird.
In der Prototypenkette des Objekts wurde während der Iteration keine Eigenschaft hinzugefügt.
Keine Eigenschaft des Objekts oder irgendetwas in seiner Prototypenkette ändert seine Aufzählbarkeit während der Iteration.
Keine nicht aufzählbare Eigenschaft überschattet eine aufzählbare.
2 Stimmen
Mögliche Duplikate von Elemente ordnen - for (... in ...) Schleife in javascript
5 Stimmen
Auch relevant: Führt ES6 eine wohldefinierte Reihenfolge der Aufzählung für Objekteigenschaften ein?
9 Stimmen
Die akzeptierte Antwort ist hier nicht mehr zutreffend. Aktuelle Antworten finden Sie hier.
1 Stimmen
@T.J.Crowder Könnten Sie etwas näher darauf eingehen, warum die akzeptierte Antwort nicht mehr stimmt? Die Frage, die Sie verlinkt haben, scheint darauf hinauszulaufen, dass die Reihenfolge der Eigenschaften immer noch nicht per Spezifikation garantiert ist.
3 Stimmen
@zero298: Die akzeptierte Antwort auf diese Frage beschreibt eindeutig die angegeben Reihenfolge der Eigenschaften ab ES2015+. Legacy-Operationen (
for-in
,Object.keys
) müssen es nicht (offiziell) unterstützen, aber es gibt es jetzt bestellen. (Inoffiziell: Firefox, Chrome und Edge befolgen alle die angegebene Reihenfolge, selbst in for-in und Object.keys, wo dies offiziell nicht vorgeschrieben ist: jsfiddle.net/arhbn3k2/1 )0 Stimmen
HINWEIS:
delete obj1.prop1
garantiert auch nicht die Reihenfolge der Schlüssel - siehe developer.mozilla.org/de-US/docs/Web/JavaScript/Reference/0 Stimmen
Ist damit Ihre Frage beantwortet? Führt ES6 eine wohldefinierte Reihenfolge der Aufzählung für Objekteigenschaften ein?
2 Stimmen
Und jetzt, ab ES2020, sogar
for-in
hat eine definierte Reihenfolge; ich habe die diese Antwort mit dem aktuellen Stand der Dinge.