map.prototype.has()用于判断map中是否含有指定键,返回布尔值,基于严格相等(===)比较,支持对象、nan等任意类型键,不涉及值比较且不查原型链。

Map.prototype.has() 用于快速判断一个 Map 实例中是否含有某个键,它返回布尔值(true 或 false),不涉及值的比较,只认键的严格相等(===)语义,包括对 NaN、对象引用等特殊值的正确处理。
基本用法:传入键,返回是否存在
调用方式很简单:`map.has(key)`。只要该键在 Map 中被设置过(哪怕对应值是 undefined 或 null),就返回 true。
-
✅ 正确示例:
const m = new Map();<br>m.set('name', 'Alice');<br>console.log(m.has('name')); // true<br>console.log(m.has('age')); // false -
⚠️ 注意:键区分类型和值
const m = new Map();<br>m.set(42, 'number');<br>m.set('42', 'string');<br>console.log(m.has(42)); // true<br>console.log(m.has('42')); // true(两个键不同,都存在)
支持所有类型的键,包括对象和 NaN
这是 Map 区别于普通对象的重要特性:has() 能准确识别引用类型和 NaN 键。
-
对象作为键(依赖引用相等):
const obj = {};<br>const m = new Map();<br>m.set(obj, 'value');<br>console.log(m.has(obj)); // true<br>console.log(m.has({})); // false(新对象,引用不同) -
NaN 也能被正确识别(Object 的 key 会转为字符串,丢失此能力):
const m = new Map();<br>m.set(NaN, 'not a number');<br>console.log(m.has(NaN)); // true
常见误用与注意事项
避免把 has() 和 get() 混用,或误以为它会触发类型转换。
-
❌ 错误假设“falsy 值 = 不存在”:
const m = new Map();<br>m.set('flag', false);<br>if (!m.get('flag')) { /* 这里会误判 */ }<br>// ✅ 应该用:if (m.has('flag')) { ... } -
❌ 不要对未定义键调用 has() 以外的操作来“探测”:
// 不推荐(多余且低效):<br>if (m.get('key') !== undefined) { ... }<br>// ✅ 推荐直接用:<br>if (m.has('key')) { ... }
对比 Object.prototype.hasOwnProperty() 的差异
Map.prototype.has() 更纯粹:它不继承、不检查原型链、不关心属性可枚举性,只看当前 Map 实例中是否明确设置了该键。
-
Object 示例(易受原型干扰):
const obj = { constructor: 'custom' };<br>console.log(obj.hasOwnProperty('constructor')); // true<br>console.log('constructor' in obj); // true(但可能来自原型) -
Map 示例(完全隔离):
const m = new Map([['constructor', 'map-value']]);<br>console.log(m.has('constructor')); // true(仅看自身设置)<br>console.log(m.has('toString')); // false(即使 Object 原型有)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











