WeakMap & Map

WeakMap & Map

核心区别在于键类型内存管理可遍历性

  1. 键类型限制:WeakMap 仅接受对象作为键(非对象如字符串、Symbol会报错),而Map支持任意类型键值。
  2. 弱引用机制:WeakMap的键是弱引用,若键对象无其他强引用,垃圾回收时自动清除对应条目,避免内存泄漏;Map强引用键,即使对象不再使用,仍保留条目导致内存无法释放。
  3. 可遍历性:WeakMap不可遍历(无sizekeys()等方法),Map支持迭代器访问所有条目。
  4. API差异:WeakMap仅有getsethasdelete方法,Map额外提供clearforEach及迭代接口。

应用场景对比

  • WeakMap:适合关联对象与元数据且无需手动清理(如DOM元素绑定事件处理器,元素移除后自动释放)。
  • Map:需长期维护键值对或遍历操作的场景(如缓存数据、频率统计)。

示例

1
2
3
4
5
6
7
8
9
10
// WeakMap:键为对象,自动清理  
const wm = new WeakMap();
let obj = {};
wm.set(obj, 'data');
obj = null; // 垃圾回收后,wm中对应条目自动清除

// Map:键任意类型,需手动管理
const map = new Map();
map.set('key', 'value');
console.log(map.size); // 1,可获取大小

内存泄漏对比

1
2
3
4
5
6
7
8
9
10
// Map导致内存泄漏  
let element = document.getElementById('app');
const map = new Map();
map.set(element, 'info');
element.remove(); // DOM移除,但map仍保留引用,element无法被回收

// WeakMap自动释放
const wm = new WeakMap();
wm.set(element, 'info');
element.remove(); // 无其他引用时,wm条目自动清除

WeakMap用于管理短期或临时状态,以及避免潜在的内存泄漏问题,适用于临时关联 生命周期与键对象绑定、缓存、模拟私有属性 的场景