You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何JavaScript对象的数字键在打印时会自动排序?

JavaScript对象键的排序规则及底层实现

一、现象的原因:ES6规范明确的属性遍历顺序

从ES6开始,JavaScript标准统一了对象属性的遍历逻辑,不再是无规则的,具体规则分为两步:

  • 首先升序遍历所有整数索引属性:这里的“整数索引”指能被转换为非负整数的字符串键——比如你写的数字键0、1、2,会被自动转为字符串"0"、"1"、"2",这类键属于整数索引范畴,必须按数值大小升序排列。
  • 然后按插入顺序遍历非整数索引的字符串属性和Symbol属性:也就是属性第一次被添加到对象中的顺序,比如你在对象字面量里先写的非数字键,遍历的时候会排在前面。

回到你的例子:数字键被归类为整数索引,所以按0、1、2的顺序排列;非数字键name和key属于普通字符串属性,按照它们在字面量中的插入顺序排列(你给出的打印结果里key在前、name在后,应该是对应你定义时的书写顺序)。

二、底层实现机制(以V8引擎为例)

主流JS引擎(比如Chrome的V8)会针对不同类型的属性做存储优化,完美匹配规范的排序规则:

  1. 整数索引属性的存储:
    引擎会把这类属性放到一个类似数组的elements区域,因为整数索引的使用场景和数组高度重合(比如模拟数组的对象),用数组结构存储既能提升访问效率,又能天然保证按数值升序返回属性。
  2. 非整数索引属性的存储:
    这类属性会被放到properties字典区域,这个结构会额外记录属性的插入顺序,遍历的时候直接按这个顺序返回,确保和插入顺序一致。

额外补充:所有对象的键(除Symbol外)最终都会转为字符串,数字键转成字符串后如果符合非负整数格式,就会被归类到整数索引区域;如果是"123a"这类无法转为纯非负整数的字符串键,会被当作普通字符串属性处理。

内容的提问来源于stack exchange,提问作者user2613946

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 05:43:13