WeakMap 和 WeakSet 与 Map、Set 有什么不同?
请说明 WeakMap/WeakSet 的特性、与 Map/Set 的区别,以及它们的实际应用场景。
回答
我是大山
WeakMap:键必须是对象(不能是基本类型),且是弱引用(不阻止 GC)。
WeakSet:值必须是对象,弱引用。
与 Map/Set 的区别:
| 特性 | Map/Set | WeakMap/WeakSet |
|------|---------|----------------|
| 键/值类型 | 任意类型 | 仅对象 |
| 引用方式 | 强引用 | 弱引用(不影响 GC) |
| 可迭代 | ✅ for...of、forEach | ❌ 没有迭代方法 |
| size 属性 | ✅ | ❌ 不可用 |
| 方法 | 完整增删查 | 仅 get/set/delete/has 或 add/delete/has |
| keys/values/entries | ✅ | ❌ |
| clear 方法 | ✅ | ❌ |
应用场景:
- DOM 节点关联数据:节点删除后,关联数据自动 GC
const cache = new WeakMap();
cache.set(element, { data: '...' });
// element 被移除后,关联数据自动回收
- 私有属性模拟:
const privates = new WeakMap();
class MyClass {
constructor() { privates.set(this, { secret: 42 }); }
getSecret() { return privates.get(this).secret; }
}
- 缓存计算结果(避免内存泄漏)