JavaScript中原始类型作对象键时除Symbol外全转字符串,这是语言规范的静态转换;Symbol保持唯一性且不可枚举;满足条件的数字字符串键会触发数组索引逻辑;Map则无隐式转换,更可靠。
javascript 中原始类型作为对象键时,除 symbol 外,全部会被自动转为字符串。这不是运行时调用 tostring() 的结果,而是语言规范在属性访问阶段就完成的静态转换,直接影响属性存储、查找和数组行为。
所有非 Symbol 原始类型都变成字符串
无论你写的是数字、布尔值、null、undefined 还是 NaN,只要用作对象属性名(点号或方括号),都会被统一转成字符串形式:
-
obj[42]等价于obj["42"] -
obj[true]→obj["true"],obj[false]→obj["false"] -
obj[null]→obj["null"],obj[undefined]→obj["undefined"] -
obj[NaN]→obj["NaN"](注意:虽然NaN !== NaN,但作为键名时都变成同一字符串)
Symbol 是唯一的例外
Symbol 不参与字符串化,它保持原始值身份,具备天然唯一性和不可枚举性:
-
Symbol("a") !== Symbol("a"),每次调用都生成新值 -
Symbol.for("a") === Symbol.for("a"),通过全局注册表可复用 - Symbol 键不会出现在
for...in、Object.keys()或JSON.stringify()中 - 要用
Object.getOwnPropertySymbols()才能获取
数字键可能触发数组索引逻辑
当字符串化的数字满足“非负整数且小于 2³²−1”时,会被识别为数组索引,从而影响 length 和数组方法行为:
-
arr[0] = "a"、arr[999] = "x"→ 触发 length 更新 -
arr[-1] = "y"、arr["1.5"] = "z"、arr[2**32] = "w"→ 只是普通属性,不改变 length
对比 Map:没有隐式转换
Map 对原始类型键的处理更直观可靠:
立即学习“Java免费学习笔记(深入)”;
-
map.set(1, "a")和map.set("1", "b")是两个独立键(1 !== "1") -
map.set(0, "zero")和map.set(-0, "minusZero")指向同一位置(SameValueZero 规则) -
map.set(NaN, "nan")后,map.get(NaN)能正确返回 —— NaN 在 Map 中被视为自等 -
undefined和null作为键各自独立,不会被转成字符串


















