WeakMap 和 WeakSet 的核心特点是持有弱引用,不阻止垃圾回收;WeakMap 键必须为对象、仅支持 get/set/has/delete,适用于为第三方对象添加私有元数据或对象级缓存;WeakSet 仅存储对象、仅支持 add/has/delete,适用于存在性标记或防重复操作;二者均不可遍历、无 size、不能用基本类型,不适合长期缓存或主数据结构。

WeakMap 和 WeakSet 的核心特点是:它们持有的引用是“弱引用”,即不阻止垃圾回收机制回收所关联的对象。一旦对象在其他地方不再被强引用,即使它还在 WeakMap 或 WeakSet 中,也会被自动移除。
WeakMap 的特点与适用场景
WeakMap 的键(key)必须是对象,且对这个对象的引用是弱引用;值(value)可以是任意类型。它不支持遍历、没有 size 属性、也没有 clear() 方法,只能通过 get、set、has、delete 操作。
- 适合为第三方对象(如 DOM 元素、外部库实例)添加私有元数据,又不想影响其生命周期
- 常用于实现对象级别的缓存或状态绑定,例如:记录某个按钮是否已被初始化过
- 避免内存泄漏——比如监听器回调中引用了外部对象,用 WeakMap 关联可确保对象销毁后缓存自动失效
WeakSet 的特点与适用场景
WeakSet 只能存储对象,且同样使用弱引用。它也不可迭代、没有 size,只提供 add、has、delete 方法。
- 适合做对象存在性标记,比如记录一组正在处理中的 DOM 节点,防止重复操作
- 可用于实现“已访问”集合,在递归遍历对象图时跳过循环引用
- 比用普通 Set + 手动清理更安全,不需要担心忘记删除导致内存堆积
它们都不适合做什么
不能用于需要稳定长期持有引用的场景:
立即学习“Java免费学习笔记(深入)”;
- 不能当通用缓存用(因为随时可能消失)
- 不能替代 Map/Set 做逻辑判断主数据结构(缺少遍历和统计能力)
- 不能用基本类型(如字符串、数字)作 WeakMap 的 key 或 WeakSet 的成员
本质上,WeakMap 和 WeakSet 是 JS 提供的轻量级、生命周期感知的辅助结构,不是功能替代品,而是内存友好型的补充工具。











