应使用 map.has(key) 判断键是否存在,因为 map.get(key) === undefined 无法区分“键存在但值为 undefined”和“键不存在”两种情况。

Map.prototype.get() 返回 undefined 不能直接当作“键不存在”的依据——这是 JavaScript 中一个高频误判点。关键在于:键存在但值被显式设为 undefined,和键压根没设置,两种情况都导致 get() 返回 undefined,但语义完全不同。
为什么 get(key) === undefined 不可靠
因为 Map 允许你存任何值,包括 undefined:
-
map.set('a', 1)→map.get('a')返回1 -
map.set('b', undefined)→map.get('b')返回undefined(但'b'是存在的) -
map.get('c')也返回undefined('c'确实不存在)
仅靠 === undefined 无法区分后两种情况,容易把“有键无值”错当成“无键”。
安全判断键是否存在的两种方式
必须明确区分「键未设置」和「键存在但值为 undefined」:
-
推荐用
map.has(key):语义清晰、行为确定,专为存在性检查设计,不关心值是什么 - 慎用
map.get(key) !== undefined</strong></li> </ul> <p>后者只在你**全程禁止向 Map 存 <code>undefined
值**的前提下才成立;一旦曾执行过map.set(k, undefined),该判断就失效。注意几个易忽略的细节
-
map.get()不传参时,参数默认为undefined,所以map.get()实际等价于map.get(undefined),会去查键为undefined的项 -
null是合法值,不会干扰!== undefined判断;但== null或!value会把0、false、''也误判为“空”,绝对不要这么用 - 如果业务逻辑需要“取值或给默认值”,优先考虑
core-js提供的map.getOrInsert(key, defaultValueFn),它内部自动用has()+set()组合,避免手动判断陷阱
不复杂但容易忽略:只要涉及存在性判断,就别绕开
has()。 -

















