普通对象中的属性顺序是Java语言中的一个复杂主题。
虽然在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.defineProperties
- Object.getOwnPropertyNames
- Object.getOwnPropertySymbols
- Reflect.ownKeys
下列方法/循环完全不保证顺序:
- 对象键
- 在..in
- JSON.parse
- JSON.stringify
结论:即使在ES2015中,您也不应依赖Javascript中普通对象的属性顺序。容易出错。使用Map
代替。