weakset通过仅存储对象且不阻止垃圾回收实现弱引用,防止内存泄漏;只接受对象,无size和遍历方法,适用于dom节点标记等安全封装场景。

WeakSet 通过只存对象、且不阻止垃圾回收的方式,实现真正的弱引用存储,从而防止内存泄漏。
WeakSet 只接受对象,拒绝原始值
它不允许添加字符串、数字、布尔值或 null 等原始值,所有成员必须是对象。这是弱引用的前提——只有对象才存在“被引用是否影响回收”的问题。
- 合法操作:let ws = new WeakSet(); ws.add({}); ws.add(document.body);
- 非法操作:ws.add("hello")、ws.add(42)、ws.add(null) 都会抛出 TypeError
引用消失后,对象自动可被回收
当一个对象仅被 WeakSet 引用,而其他地方(变量、属性、闭包等)都不再持有它的强引用时,垃圾回收器会把它连同 WeakSet 中的对应条目一并清理掉。
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
- 例如:const obj = {}; const ws = new WeakSet(); ws.add(obj); obj = null; —— 此时 obj 已不可达,会被 GC 回收,WeakSet 内部也自动“忘记”它
- 对比普通 Set:同样操作下,Set 仍保留对 obj 的强引用,obj 无法被回收,造成内存滞留
不暴露内部状态,天然支持安全封装
WeakSet 没有 size 属性,不能遍历(无 forEach、values、keys),也不能转成数组。这种“不可枚举性”不是缺陷,而是设计使然:
- 避免开发者误以为能长期持有或检查内容
- 确保它只用于“标记”或“关联”场景,比如记录某个 DOM 节点是否已被初始化过
- 典型用途:在组件卸载前,用 ws.has(node) 判断是否需要清理;节点被移除后,ws 自动失效,无需手动 delete
配合 DOM 使用,解决常见泄漏点
页面中频繁增删 DOM 元素时,最容易因缓存或状态绑定导致泄漏。WeakSet 是轻量级解决方案:
- 给已处理的节点打标记:
processedNodes.add(node),后续可通过processedNodes.has(node)快速判断 - 节点被 remove() 或 innerHTML 替换后,只要没有其他 JS 变量引用它,它就会被回收,WeakSet 不拖后腿
- 不需要像 Map 那样在节点销毁时同步调用 delete,省去清理逻辑,降低出错概率
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










