为何Object.keys()返回排序后的对象键?示例解析
为什么Object.keys()会返回排序后的键值?
这个问题问得好!很多人第一次遇到这种情况都会疑惑——明明定义对象时键的顺序是100、2、7,调用Object.keys(anObj)却得到了["2", "7", "100"]。其实这是ES6(ECMAScript 2015)之后规范明确规定的行为,并非随机或引擎差异导致的。
具体的排序规则是这样的:
- 第一步:整数类型键排序:先处理所有可以被解析为十进制整数的键(哪怕你定义时用的是数字,对象的键最终都会转为字符串,比如
100会变成"100"),这些键会按照数值从小到大的顺序排列。
你的例子里,"100"、"2"、"7"都属于这类键,所以按数值2 < 7 < 100排序,就得到了["2", "7", "100"]。 - 第二步:非整数字符串键排序:处理完整数键后,剩下的非整数字符串键(比如
"foo"、"bar2"这类),会按照它们被添加到对象中的顺序排列。 - 第三步:Symbol类型键排序:最后处理Symbol类型的键,同样按照添加顺序排列。
补充:ES5及以前的情况
在ES5以及更早的版本中,规范并没有定义对象键的遍历顺序,不同JavaScript引擎可能会有不同的实现,那时候确实可能出现键顺序和定义顺序一致的情况,但这是不可靠的。ES6之后才统一了这个规则,让遍历行为在所有引擎下保持一致。
内容的提问来源于stack exchange,提问作者Santhosh Acharya
相关产品推荐
相关产品推荐

