WeakSet是仅存储对象弱引用的集合,不阻止垃圾回收,不可遍历、无size属性,仅支持add()、delete()、has()方法,适用于对象状态标记等防内存泄漏场景。

WeakSet 用于存储对象的弱引用集合,这些对象不会阻止垃圾回收——也就是说,只要对象在其他地方没有被强引用,即使它还在 WeakSet 中,也会被自动清除。
WeakSet 的核心特点
它只能存储对象(不能是原始值如字符串、数字),且不支持遍历、长度查询或清除全部元素。它的“弱”体现在:内部引用不计入对象的引用计数。
- 构造函数:必须用
new WeakSet()创建,不能用字面量 - 只提供三个方法:
add()、delete()、has() - 无法枚举内容,没有
size属性,也不能用for...of或forEach - 典型用途是做对象状态标记或临时关联,避免内存泄漏
基本用法示例
比如你想标记某些对象是否已被处理过,又不想长期持有它们:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
const processed = new WeakSet();
function handle(obj) {
if (processed.has(obj)) return;
// 实际处理逻辑...
console.log('处理对象:', obj);
processed.add(obj); // 只存对象本身,不阻止回收
}
const item = { id: 1 };
handle(item); // 第一次处理
handle(item); // 第二次直接返回(已标记)
// item 被设为 null 后,WeakSet 内部引用自动失效,不阻碍 GC
item = null;
常见适用场景
WeakSet 特别适合需要“临时绑定”又怕内存泄漏的场合:
立即学习“Java免费学习笔记(深入)”;
-
私有数据隔离:配合闭包模拟私有属性,外部无法访问 WeakSet,但能通过
has()判断归属 - 事件监听去重:记录已绑定监听器的对象,防止重复添加(尤其在组件卸载时自动清理)
- 循环引用防护:在深克隆或遍历时记录已访问对象,避免无限递归,且不干扰原始对象生命周期
注意和限制
WeakSet 不是万能容器,用错场景反而会让逻辑变难调试:
- 不能存
null、undefined或原始值,否则报TypeError - 无法知道当前存了多少个对象,也无法批量操作,设计时需接受“不可观察性”
- 不要试图用 WeakSet 替代 Set 做常规集合管理;它解决的是引用生命周期问题,不是数据结构问题
- 测试时要注意:GC 时机不确定,
has()返回false不一定代表刚被删,也可能还没触发回收

















