weakmap.prototype.has 用于判断指定对象是否作为键存在于 weakmap 中,只接受对象参数并返回布尔值;它基于严格相等比较同一引用,不支持原始值,且因弱引用特性,键被垃圾回收后返回 false。

WeakMap.prototype.has 用于判断某个对象是否作为键存在于 WeakMap 实例中。它只接受对象类型作为参数,返回布尔值,表示该对象是否被用作当前 WeakMap 的键。
必须传入对象,否则报错
WeakMap 的键只能是对象(包括函数、数组、普通对象、DOM 元素等),不能是原始值(如字符串、数字、null、undefined、symbol)。传入非对象会直接抛出 TypeError。
-
❌ 错误写法:
weakMap.has("key")、weakMap.has(42)、weakMap.has(null) -
✅ 正确写法:
weakMap.has({})、weakMap.has(someObj)、weakMap.has(document.body)
检测的是“同一对象引用”,不是内容相等
WeakMap 不比较对象内容或属性,只检查是否为**严格相等(===)的同一个对象实例**。即使两个对象结构完全一样,只要不是同一个引用,has 就返回 false。
const a = {}; const b = {}; weakMap.set(a, 1); weakMap.has(b); // falseweakMap.has(a); // true
键可能已被垃圾回收,has 返回 false
WeakMap 的“弱”体现在:如果一个对象仅作为 WeakMap 的键存在,且无其他强引用,它可能随时被垃圾回收。一旦回收,has 就会返回 false,哪怕你之前调用过 set。
- 这属于正常行为,不是 bug,也不可预测——无法通过
has判断对象是否“还活着”,只能确认“当前是否仍被持有” - 因此,
has适合做存在性快照检查,不适合做状态持久化依据
典型使用场景示例
常用于私有元数据存储,比如给 DOM 元素附加不干扰其生命周期的数据:
const elementData = new WeakMap();elementData.set(button, { clicked: 0 });if (elementData.has(button)) { /* 安全访问 */ }- 页面卸载或 button 被移除后,
elementData.has(button)自动变为false
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











