Map.prototype.has()用于检查键是否存在于Map实例中,返回布尔值;对原始值按值比较(===),对象按引用比较,NaN视为相等;区别于in和hasOwnProperty,它不查原型链且能准确区分“键不存在”与“键存在但值为undefined”。

Map.prototype.has() 方法专门用来检查某个键是否存在于 Map 实例中,返回布尔值 true 或 false,不涉及值的获取或类型转换,语义清晰、性能高效。
has 方法的基本用法
调用方式很简单:传入要检测的键作为参数,Map 会严格比对键的引用或值(取决于键的类型):
- 对于字符串、数字、布尔值等原始值,按值相等判断(类似
===) - 对于对象、函数、Symbol 等引用类型,按内存地址判断(即必须是同一个引用)
- NaN 作为键时,
has(NaN)会正确返回true(Map 内部使用 SameValueZero 算法,NaN 被视为相等)
和 in 操作符、Object.hasOwnProperty() 的区别
普通对象用 in 或 hasOwnProperty() 检查属性,但它们受原型链影响,且无法准确处理 undefined 值;Map 的 has() 不受原型干扰,且能明确区分“键不存在”和“键存在但值为 undefined”:
-
map.has(key)→ 只关心键是否存在,与值无关 -
key in obj→ 会查找原型链上的属性 -
obj.hasOwnProperty(key)→ 虽然不查原型,但对象本身可能没这个属性,也可能属性值就是undefined,无法单靠obj[key] !== undefined判断
常见易错点提醒
注意以下几种典型场景,避免误判:
立即学习“Java免费学习笔记(深入)”;
- 对象键必须是同一引用:
map.set({a:1}, 'val'); map.has({a:1})返回false,因为两个对象不是同一个实例 - 数字
0和字符串"0"是不同键:map.set(0, 'num'); map.has("0")→false - Symbol 键需用同一个 Symbol 实例:
const s = Symbol('x'); map.set(s, 1); map.has(s)→true,但map.has(Symbol('x'))→false
配合 set 和 get 的典型使用模式
实际开发中常组合使用,比如避免重复设置、安全读取值:
- 先检查再设值:
if (!map.has(key)) map.set(key, defaultValue); - 有则更新、无则忽略:
if (map.has(key)) map.set(key, newValue); - 安全读取(避免
undefined):const value = map.has(key) ? map.get(key) : fallback;


















