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 规范:遍历顺序规则

  1. 整数键(正整数字符串):按数值升序
  2. 字符串键:按插入顺序
  3. 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)]

posted @ 2026-04-08 18:44  去年冬天见了一面  阅读(12)  评论(0)    收藏  举报