Map键比较使用Object.is()实现同值相等,故NaN可作唯一键、+0与-0被视为不同键;对引用类型仍按内存地址判断,与===一致。

Map 的键比较使用的是 同值相等(Same-value equality),也就是 Object.is() 的判断逻辑,而不是 == 或 ===。这决定了 Map 如何识别“同一个键”——尤其在处理 NaN、+0 和 -0 这类特殊值时,行为和日常直觉或严格相等不同。
为什么 Map 不用 ===?
因为 === 无法区分 +0 和 -0(它们被当作相等),也无法让 NaN === NaN 成立(它返回 false)。而 Map 需要稳定、可预测的键映射:同一个键多次设值应覆盖,不同键必须不冲突。Object.is 正好满足这个底层需求:
-
Object.is(NaN, NaN)→true(NaN可以作为有效且唯一的键) -
Object.is(+0, -0)→false(+0和-0是两个不同的键) -
Object.is(0, -0)→false(同上,0实际是+0) - 对普通数字、字符串、布尔值等,
Object.is(a, b)和a === b行为一致
实际表现举例
看这几行代码就能看清差异:
DMap GL地图JSAPI(dmapgl)开发指南。用于编写、审查、调试 DMap 地图 API 代码,涵盖地图初始化、覆盖物渲染、图层管理、事件处理、控件交互等任务。当用户提及 dmap、dmapgl、jsapi‑gl 或相关地图开发需求时自动触发。
const map = new Map(); map.set(NaN, 'nan value'); console.log(map.get(NaN)); // 'nan value' ✅ 可以取到 map.set(+0, 'positive zero'); map.set(-0, 'negative zero'); console.log(map.size); // 2 ✅ +0 和 -0 被视为不同键 map.set(0, 'zero'); console.log(map.get(+0)); // 'positive zero' console.log(map.get(0)); // 'zero'(因为 0 就是 +0)
和对象/函数作键的区别
虽然 Object.is 是 Map 键比较的底层规则,但它只影响“原始值键”的判定逻辑;对于对象、函数等引用类型,Map 依然靠内存地址判断:
-
{}和{}是两个不同对象 →Object.is({}, {})是false→ Map 当作两个不同键 - 同一个对象实例反复用作键 →
Object.is(obj, obj)是true→ Map 会覆盖而非新增 - 注意:
Object.is对引用类型的行为和===完全一致,都是比引用
你不需要手动调用 Object.is,但得知道它在起作用
Map 内部自动使用 Object.is 判断键是否已存在,开发者无需干预。但理解这点能帮你避开坑:
- 别指望
map.get(-0)拿到map.set(+0, ...)存的值 -
NaN作为键是安全且可用的(不像===下无法检测) - 如果业务逻辑依赖
+0 === -0,那就别直接用数值做 Map 键,改用字符串标识如'+0'、'-0'

















