CodeWalk

WeakMap 和 WeakSet 与 Map、Set 有什么不同?

作者:我是大山 · 2026-05-30 12:55

请说明 WeakMap/WeakSet 的特性、与 Map/Set 的区别,以及它们的实际应用场景。

回答

我是大山

WeakMap:键必须是对象(不能是基本类型),且是弱引用(不阻止 GC)。

WeakSet:值必须是对象,弱引用。

与 Map/Set 的区别: | 特性 | Map/Set | WeakMap/WeakSet | |------|---------|----------------| | 键/值类型 | 任意类型 | 仅对象 | | 引用方式 | 强引用 | 弱引用(不影响 GC) | | 可迭代 | ✅ for...offorEach | ❌ 没有迭代方法 | | size 属性 | ✅ | ❌ 不可用 | | 方法 | 完整增删查 | 仅 get/set/delete/hasadd/delete/has | | keys/values/entries | ✅ | ❌ | | clear 方法 | ✅ | ❌ |

应用场景

  1. DOM 节点关联数据:节点删除后,关联数据自动 GC
const cache = new WeakMap();
cache.set(element, { data: '...' });
// element 被移除后,关联数据自动回收
  1. 私有属性模拟
const privates = new WeakMap();
class MyClass {
  constructor() { privates.set(this, { secret: 42 }); }
  getSecret() { return privates.get(this).secret; }
}
  1. 缓存计算结果(避免内存泄漏)