Die Eigenschaftsreihenfolge in normalen Objekten ist ein komplexes Thema in Javascript.
Während in ES5 explizit keine Reihenfolge angegeben wurde, hat ES2015 in bestimmten Fällen eine Reihenfolge. Gegeben ist folgendes Objekt:
o = Object.create(null, {
m: {value: function() {}, enumerable: true},
"2": {value: "2", enumerable: true},
"b": {value: "b", enumerable: true},
0: {value: 0, enumerable: true},
[Symbol()]: {value: "sym", enumerable: true},
"1": {value: "1", enumerable: true},
"a": {value: "a", enumerable: true},
});
Dies führt in der folgenden Reihenfolge (in bestimmten Fällen):
Object {
0: 0,
1: "1",
2: "2",
b: "b",
a: "a",
m: function() {},
Symbol(): "sym"
}
- Ganzzahlige Schlüssel in aufsteigender Reihenfolge
- normale Schlüssel in Einfügereihenfolge
- Symbole in Einfügereihenfolge
Somit gibt es drei Segmente, die die Einfügereihenfolge ändern können (wie im Beispiel geschehen). Und ganzzahlige Schlüssel halten sich überhaupt nicht an die Einfügereihenfolge.
Die Frage ist, für welche Methoden diese Reihenfolge in der ES2015-Spezifikation garantiert ist.
Die folgenden Methoden garantieren die angezeigte Reihenfolge:
- Object.assign
- Object.defineProperties
- Object.getOwnPropertyNames
- Object.getOwnPropertySymbols
- Reflect.ownKeys
Die folgenden Methoden / Schleifen garantieren überhaupt keine Bestellung:
- Object.keys
- für in
- JSON.parse
- JSON.stringify
Fazit: Auch in ES2015 sollten Sie sich nicht auf die Eigenschaftsreihenfolge normaler Objekte in Javascript verlassen. Es ist fehleranfällig. Verwenden Sie Map
stattdessen.