Порядок свойств в обычных объектах - сложный объект в 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"
}
- целочисленные ключи в порядке возрастания
- обычные ключи в порядке вставки
- Символы в порядке вставки
Таким образом, есть три сегмента, которые могут изменить порядок вставки (как это произошло в примере).И целочисленные ключи вообще не придерживаются порядка вставки.
Вопрос в том, для каких методов этот порядок гарантирован в спецификации ES2015?
Следующие методы гарантируют порядокпоказано:
- Object.assign
- Object.defineProperties
- Object.getOwnPropertyNames
- Object.getOwnPropertySymbols
- Reflect.ownKeys
Следующие методы / циклы гарантируют отсутствие заказа вообще:
- Object.keys
- for..in
- JSON.parse
- JSON.stringify
Вывод: даже в ES2015 не следует полагаться на порядок свойств обычных объектов в Javascript.Это склонно к ошибкам.Вместо этого используйте Map
.