Object.keys() 的顺序陷阱:为什么遍历结果不一致?
插入顺序、数字键、Symbol 的隐秘规则。依赖遍历顺序的代码,生产环境随机崩溃。
事故现场
const obj = {
"3": "三",
"1": "一",
"2": "二",
"a": "字母a",
"b": "字母b"
};
Object.keys(obj); // ["1", "2", "3", "a", "b"] ❌ 不是插入顺序!
预期: ["3", "1", "2", "a", "b"](插入顺序)
实际: 数字键升序 → 字符串键插入顺序
ECMAScript 规范:遍历顺序规则
- 整数键(正整数字符串):按数值升序
- 字符串键:按插入顺序
- Symbol 键:按插入顺序
jv
const obj = {
"10": "十", // 整数键
"2": "二", // 整数键(数值 2 < 10)
"a": "字母a", // 字符串键
[Symbol('s')]: "符号", // Symbol 键
"1": "一", // 整数键(数值 1 最小)
"b": "字母b" // 字符串键,按插入在 a 之后
};
Object.keys(obj); // ["1", "2", "10", "a", "b"]
Object.getOwnPropertySymbols(obj); // [Symbol(s)]

浙公网安备 33010602011771号