普通对象中的属性顺序是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代替。