javascript中map对基本类型键使用samevaluezero算法比对,+0与-0相等、nan等于自身,支持精确值匹配;symbol键唯一安全;避免使用包装对象作键。

JavaScript 中 Map 对基本数据类型(如字符串、数字、布尔值、null、undefined、Symbol)的键名比对,**默认使用严格相等(===)语义**,这和对象属性名(只支持字符串/符号)或 WeakMap 都不同。只要值严格相等,就视为同一键 —— 这一点天然可靠,无需额外处理。
基本类型键的比对完全按值进行
Map 内部用“SameValueZero”算法判断键是否相等(ES2015 规范),它和 === 几乎一致,唯一区别是 +0 === -0 为 true,且 NaN 被视为等于自身(而 NaN === NaN 是 false)。这对日常开发很友好:
-
map.set("name", "Alice")和map.get("name")能精准命中 -
map.set(42, "answer")和map.get(42)没有类型转换,map.get("42")查不到 -
map.set(true, "yes")不会和map.set(1, "one")冲突 -
map.set(NaN, "not a number")可以被map.get(NaN)正确取回(这是Map特有的行为)
注意隐式类型转换陷阱
虽然 Map 本身不转换类型,但开发者可能在存取时无意中引入类型不一致:
- 从表单、URL 参数或 JSON 解析来的数字常是字符串,比如
"123"vs123→ 它们是不同键 - 布尔值
true和字符串"true"也互不相等 - 建议统一转换:存之前转成目标类型,例如
map.set(Number(id), user)或map.set(String(uid), config)
Symbol 作为键是完全安全的
每个 Symbol() 都是唯一值,不会发生意外碰撞:
const KEY = Symbol("id"); map.set(KEY, 100); map.get(KEY) // 100 ✅map.get(Symbol("id")) // undefined ❌(新 Symbol,不相等)- 若需跨模块共享,用
Symbol.for("key")创建全局注册符号
避免把对象当基本类型用
如果误将包装对象(如 new String("a")、new Number(42))作为键,它们是引用类型,每次新建都不同,导致无法取回:
map.set(new String("x"), "value"); map.get("x") // undefined ❌map.get(new String("x")) // undefined ❌(两个不同对象)- 应始终用原始值:
"x"、42、true等
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











