js实现weakmap

WeakMap 的基本概念
WeakMap 是 JavaScript 中的一种集合类型,用于存储键值对。与 Map 不同,WeakMap 的键必须是对象(非原始值),且键是弱引用的。这意味着当键对象没有其他引用时,它会被垃圾回收机制自动回收,对应的键值对也会从 WeakMap 中移除。

WeakMap 的特点
- 键必须是对象(非原始值如字符串、数字等)。
- 键是弱引用,不会阻止垃圾回收。
- 不可枚举,没有方法直接获取所有键或值。
- 支持的方法:
set()、get()、has()、delete()。
创建和使用 WeakMap
const weakMap = new WeakMap();
const key1 = {};
const key2 = {};
// 设置键值对
weakMap.set(key1, 'value1');
weakMap.set(key2, 'value2');
// 获取值
console.log(weakMap.get(key1)); // 输出: 'value1'
// 检查键是否存在
console.log(weakMap.has(key1)); // 输出: true
// 删除键值对
weakMap.delete(key1);
console.log(weakMap.has(key1)); // 输出: false
WeakMap 的垃圾回收行为
当键对象没有其他引用时,垃圾回收机制会自动回收该键,并从 WeakMap 中移除对应的键值对。
let key = {};
const weakMap = new WeakMap();
weakMap.set(key, 'some value');
// 移除 key 的引用
key = null;
// 垃圾回收后,weakMap 中的键值对会被自动移除
WeakMap 的应用场景
- 私有数据存储:WeakMap 可用于模拟对象的私有属性,因为外部无法直接访问 WeakMap 中的键值对。
- 缓存机制:当缓存的对象不再需要时,WeakMap 会自动清理对应的缓存条目,避免内存泄漏。
WeakMap 与 Map 的区别
| 特性 | WeakMap | Map |
|---|---|---|
| 键类型 | 必须是对象 | 任意类型 |
| 键引用 | 弱引用 | 强引用 |
| 可枚举性 | 不可枚举 | 可枚举 |
| 垃圾回收 | 自动清理无引用的键 | 需手动清理 |
注意事项
- WeakMap 没有
size属性或clear()方法。 - 不支持迭代(如
forEach()、keys()、values())。 - 主要用于与对象生命周期相关的场景,避免内存泄漏。
通过以上内容,可以全面了解 JavaScript 中 WeakMap 的实现和使用方法。






