Object.entries索引疑问:为何0索引返回的是定义时第二个键值对?
为什么Object.entries返回的数字键顺序和定义时不一样?
这是个非常典型的JavaScript对象行为问题,你猜的没错——核心原因就是数字类型的对象键会被自动按数值大小排序,完全不遵循你定义时的顺序!
具体规则是这样的:
JavaScript对象的键遍历(包括Object.entries、Object.keys、for...in循环)会遵循一套固定的顺序:
- 首先,所有可以被解析为十进制整数的键(不管你写的是数字字面量还是字符串形式的数字,比如
'2'和2都会被视为同一类),会按照数值升序排列; - 之后,才是其他类型的键(比如非数字字符串、Symbol),按照它们被插入到对象中的顺序排列。
回到你的例子:
const object3 = { 100: 'a', 2: 'b', 7: 'c' };
这里的三个键100、2、7都是整数类型的键,所以会被自动排序为2 → 7 → 100,对应的Object.entries返回的数组自然就是:
[["2", "b"], ["7", "c"], ["100", "a"]]
所以取索引0的元素,就是["2", "b"]啦。
怎么验证这个规则?
你可以用for...in循环遍历对象,会得到完全一样的顺序:
for (const key in object3) { console.log(key); // 依次输出: 2, 7, 100 }
如果想保留定义顺序怎么办?
如果你的业务逻辑需要严格遵循键的插入顺序,推荐使用Map而不是普通对象。Map会完全按照你添加键值对的顺序保存和遍历:
const map3 = new Map([ [100, 'a'], [2, 'b'], [7, 'c'] ]); console.log(Array.from(map3.entries())[0]); // 输出: [100, "a"]
内容的提问来源于stack exchange,提问作者ashfaq.p
相关产品推荐
相关产品推荐

