weakmap 适合存储对象到数据的映射,键必须是对象且为弱引用,不阻止垃圾回收;值为强引用,不可遍历、无 size,适用于 dom 状态绑定等依附对象生命周期的场景。

WeakMap 适合用来存储“对象到数据”的映射,且当键对象不再被其他地方引用时,整个键值对会自动被垃圾回收,从而避免内存泄漏。
WeakMap 的核心特点
WeakMap 的键必须是对象(不能是原始值),而且这个键是弱引用的——也就是说,它不会阻止垃圾回收器回收该对象。只要这个对象在 WeakMap 外部没有其他强引用,哪怕它还在 WeakMap 里作为键,也会被回收,对应条目也就消失。
- 键只能是对象(包括函数、数组、DOM 元素等)
- 不支持遍历(没有 keys()、values()、entries() 方法)
- 没有 size 属性,无法获知当前有多少条目
- 只能通过已知键来 get/set/delete
典型使用场景:为对象附加私有元数据
比如你想给某个 DOM 元素绑定一个事件处理器,并附带一些状态(如是否已初始化),又不想污染元素本身或用属性名冲突。WeakMap 是理想选择:
const elementState = new WeakMap();
function initElement(el) {
if (elementState.has(el)) return;
elementState.set(el, { initialized: true, count: 0 });
el.addEventListener('click', () => {
const state = elementState.get(el);
state.count++;
console.log(`Clicked ${state.count} times`);
});
}
一旦 el 被从 DOM 移除且无其他引用,它会被回收,elementState 中对应的条目也自动消失,不会残留。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
对比 Map:为什么不用普通 Map?
如果用 Map 存储 DOM 元素为键:
- 即使元素已被移除、无其他引用,Map 仍持有它的强引用 → 元素无法被 GC → 内存泄漏
- 你得手动清理 Map(比如监听元素销毁、调用 delete),容易遗漏
- WeakMap 把清理交给引擎,更可靠、更轻量
注意事项和常见误区
WeakMap 不是万能的缓存工具,也不适用于需要长期稳定映射的场景:
- 不能用字符串、数字、null 等做键 —— 会报错
- 无法迭代或清空全部内容,所以不适合做通用缓存(考虑用 Map + 手动管理生命周期)
- 调试困难:Chrome DevTools 中 WeakMap 显示为 empty,即使里面还有有效条目
- 不要试图用 WeakMap 实现“弱引用变量”——它只弱引用键,值仍是强引用;若值又引用了键,可能形成循环引用,阻碍回收
不复杂但容易忽略:WeakMap 的价值不在功能多,而在它默默帮你绕开最常见的引用泄漏陷阱。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










