weakset 是仅存储对象弱引用的集合,不阻止垃圾回收,只支持 add、has、delete 操作,不可遍历、无 size、不能存原始值;适用于私有状态标记与防重复处理等场景。

WeakSet 是 JavaScript 中用于存储**对象类型**的弱引用集合,它自动管理内存、不阻止垃圾回收,且只支持添加、检查存在、删除三个操作,不能遍历、不能获取大小、也不能存储原始值(如字符串、数字)。
WeakSet 的核心特点
理解 WeakSet 的行为是正确使用的前提:
- 只接受对象(包括函数、数组、普通对象等),传入原始值会报错
- 对所存对象是弱引用:如果该对象在其他地方没有强引用,即使还在 WeakSet 中,也会被垃圾回收器回收
- 没有
size属性,不能forEach,不能values()或entries()—— 无法遍历或查看内容 - 只有三个方法:
add(obj)、has(obj)、delete(obj)
基本用法示例
创建 WeakSet 并添加对象:
const ws = new WeakSet();
const obj1 = { name: 'Alice' };
const obj2 = { age: 30 };
ws.add(obj1);
ws.add(obj2);
console.log(ws.has(obj1)); // true
console.log(ws.has({ name: 'Alice' })); // false(不是同一个对象引用)
ws.delete(obj1);
console.log(ws.has(obj1)); // false
典型应用场景:私有状态与临时标记
WeakSet 常用于不污染对象自身、又需“记住某个对象是否被处理过”的场景,比如:
- 避免重复初始化:给 DOM 元素打标记,防止多次绑定事件
- 实现类的私有属性(配合闭包或 Symbol,但 WeakSet 可让私有数据随实例自动清理)
- 缓存中间计算结果,但仅限于对象生命周期内有效
示例:防重复事件绑定
const boundElements = new WeakSet();
function setupClickHandler(el, handler) {
if (!boundElements.has(el)) {
el.addEventListener('click', handler);
boundElements.add(el);
}
}
// 当 el 被移除 DOM 且无其他引用时,boundElements 中的对应条目自动失效,无需手动清理
注意事项与常见误区
- ❌ 不能用
new WeakSet([obj1, obj2])初始化 —— WeakSet 构造函数不接受可迭代对象参数 - ❌ 不能存储
null或undefined(它们不是对象) - ❌ 不要试图用 WeakSet 替代 Set 来做去重逻辑,除非你明确需要“弱引用 + 自动清理”特性
- ✅ 检查存在性必须使用同一对象引用,因为 WeakSet 内部用的是引用相等(
===)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











