JavaScript 的对象里面的 key,在遍历时真的是无序的吗?
这里的「遍历」包括下面这些情形:
for..inObject.keys()Reflect.ownKeys()Object.getOwnPropertyNames()
结论:
- 在 ES6 之前,是无序的
- 在 ES6 之后,顺序是这样的
- 自然数字符串升序排列
- 非自然数字符串按插入对象中的先后顺序排列
- 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