在 JavaScript 中,调用 Object.keys 方法时,返回的键数组是否一定是有序的?如果有序,其排序规则是什么?
考察说明
考查对 Object.keys 返回顺序规范的理解,以及不同键类型的排序特性。
回答思路
- 【回答框架 1】Object.keys 返回顺序遵循对象自身属性键的枚举顺序,该顺序由 ECMAScript 规范定义,其规则是整数索引键(如 '0'、'1')按升序排在最前,其次是字符串键(按插入顺序),最后是 Symbol 键(按插入顺序)。
- 【回答框架 2】整数索引键指的是数组索引(0 到 2^32-2),它们在 for-in 和 Object.keys 中会优先按数字升序出现,这可能导致与插入顺序不同。
- 【回答框架 3】对于字符串键(如 'name'、'age'),其顺序与插入顺序一致,但需注意 ES2015 之前规范未定义顺序,现代实现均遵循此规则。
- 【回答框架 4】如果删除已有属性再重新添加同名属性,该属性的位置会变为最后,因为顺序基于属性创建或最后创建的时间。
- 【回答框架 5】Object.values 和 Object.entries 遵循同样的顺序规则,因为它们是基于 Object.keys 的键顺序进行收集的。
- 【关键点 1】Object.keys 的返回顺序由 ES2015 规范定义,整数键升序在前,字符串键按插入顺序,Symbol 键按插入顺序。
- 【关键点 2】顺序仅针对对象自身可枚举属性,不包括继承属性。
- 【关键点 3】删除并重新添加属性会使其排到末尾,因为顺序按属性创建时间。
- 【关键点 4】整数索引键(0 到 2^32-2)优先升序排列,即使它们以非整数形式(如 '1')存在。
- 【关键点 5】循环引用或不可枚举属性不影响键顺序,因为 Object.keys 只返回可枚举属性。
- 【易错点 1】容易误以为所有键都按插入顺序返回,实际整数键会强制升序优先。
- 【易错点 2】在 ES2015 之前,顺序未标准化,但现代引擎均遵循规范,仍需注意兼容性。
- 【易错点 3】对于数组对象,Object.keys 返回的是索引字符串,顺序是索引升序,与元素插入顺序无关。