通常のオブジェクトのプロパティの順序は、JavaScriptの複雑なテーマです。
ES5では明示的に順序が指定されていませんが、ES2015では特定の場合に順序があります。次のオブジェクトがあります。
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},
});
これにより、次の順序になります(特定の場合)。
Object {
0: 0,
1: "1",
2: "2",
b: "b",
a: "a",
m: function() {},
Symbol(): "sym"
}
- 昇順の整数のようなキー
- 挿入順の通常のキー
- 挿入順の記号
したがって、3つのセグメントがあり、(例で発生したように)挿入順序を変更する可能性があります。そして、整数のようなキーは挿入順序にまったく固執しません。
問題は、ES2015仕様でこの順序が保証されているメソッドは何ですか?
次のメソッドは、表示される順序を保証します。
- Object.assign
- Object.defineProperties
- Object.getOwnPropertyNames
- Object.getOwnPropertySymbols
- Reflect.ownKeys
次のメソッド/ループは、順序をまったく保証しません。
- Object.keys
- のために
- JSON.parse
- JSON.stringify
結論:ES2015でも、JavaScriptの通常のオブジェクトのプロパティの順序に依存するべきではありません。エラーが発生しやすい。Map
代わりに使用してください。