对象里面的 key 真的无序吗?

120 阅读1分钟

JavaScript 的对象里面的 key,在遍历时真的是无序的吗?

这里的「遍历」包括下面这些情形:

  1. for..in
  2. Object.keys()
  3. Reflect.ownKeys()
  4. Object.getOwnPropertyNames()

结论:

  1. 在 ES6 之前,是无序的
  2. 在 ES6 之后,顺序是这样的
    1. 自然数字符串升序排列
    2. 非自然数字符串按插入对象中的先后顺序排列
    3. Symbol 按插入对象中的先后顺序排列

举例:

const o = {
  [Symbol('first')]: 'first',
  2: 2,
  1: 1,
  3: 3,
  0: 0,
  b: 'b',
  a: 'a',
  [Symbol('second')]: 'second',
}

上面这个对象,使用 Reflect.ownKeys() 遍历出来的 key 的顺序是这样的

['0', '1', '2', '3', 'b', 'a', Symbol(first), Symbol(second)]

注意:其他 3 种遍历形式无法遍历出 Symbol key