ES6起对象属性遍历顺序标准化:先按数值升序排列整数索引键(如"0""1""10"),再按插入顺序排列非数字字符串键,最后按插入顺序排列Symbol键;Object.keys()等五种方法均遵循此规则。

ES6(即 ECMAScript 2015)起,对象属性的遍历顺序被正式标准化,不再是各引擎随意实现。它不是按定义顺序“原样”返回,而是有明确优先级规则。
数字键(整数字符串形式)优先升序排列
所有属性名是纯数字字符串(如 "0"、"1"、"10"、"100")的键,会被识别为“整数索引”,并按数值大小升序排在最前面。注意:不是按字符串字典序,而是按数字大小。
-
{ "10": "ten", "1": "one", "2": "two" }→Object.keys()返回["1", "2", "10"] -
"01"、"-5"、"1.5"不算整数索引,归入后续字符串键
其余字符串键按插入顺序排列
非整数索引的字符串键(比如 "name"、"user_id"、"01"、"a2"),不参与数字排序,而是严格按它们被添加到对象中的时间顺序排列。
用于 inference.sh 的 JavaScript/TypeScript SDK,可运行 AI 应用、构建代理、集成 150+ 模型。包名:@inferencesh/sdk(npm install),完整 TypeScript 支持。
-
const obj = {}; obj.b = 1; obj.a = 2; obj.c = 3;→Object.keys(obj)是["b", "a", "c"] - 用对象字面量声明时,也以书写顺序为准(但若含数字键,仍先被提取排序)
Symbol 键最后按插入顺序排列
所有 Symbol 类型的属性名(如 Symbol('id'))统一排在字符串键之后,且彼此之间保持添加顺序。
-
const s1 = Symbol('a'); const s2 = Symbol('b'); const obj = { x: 1, [s2]: 2, [s1]: 3 };→Reflect.ownKeys(obj)返回["x", s2, s1] -
Object.keys()和Object.getOwnPropertyNames()都不包含 Symbol,需用Object.getOwnPropertySymbols()或Reflect.ownKeys()获取
所有标准遍历方法遵循同一顺序
以下五种方法都调用内部 [[OwnPropertyKeys]] 算法,因此顺序完全一致:
-
for...in(含继承可枚举属性,但自身属性顺序仍遵守该规则) Object.keys()Object.getOwnPropertyNames()Object.getOwnPropertySymbols()-
Reflect.ownKeys()(最完整,返回全部自身键,含 Symbol)
这个顺序设计让对象行为更可预测,尤其在序列化、调试和依赖键序的逻辑中更可靠。但若业务强依赖稳定插入顺序(比如 UI 渲染顺序、配置优先级),仍建议用 Map —— 它对任意键类型都只认插入顺序,无数字键特殊处理。

















