js实现weakmap
WeakMap 的基本概念
WeakMap 是 JavaScript 中的一种集合类型,允许将对象作为键名。与普通的 Map 不同,WeakMap 的键名必须是对象,且键名是弱引用,不会阻止垃圾回收机制对键名对象的回收。当键名对象被回收后,对应的键值对会自动从 WeakMap 中移除。
创建 WeakMap
使用 new WeakMap() 构造函数可以创建一个空的 WeakMap。WeakMap 的键必须是对象,值可以是任意类型。
const weakMap = new WeakMap();
const keyObj = {};
weakMap.set(keyObj, 'value associated with keyObj');
WeakMap 的常用方法
WeakMap 提供了三个主要方法:set、get 和 has,以及一个 delete 方法。与 Map 不同,WeakMap 不支持迭代或直接访问所有键值对。
const weakMap = new WeakMap();
const keyObj = {};
// 设置键值对
weakMap.set(keyObj, 'some value');
// 获取值
console.log(weakMap.get(keyObj)); // 输出: 'some value'
// 检查键是否存在
console.log(weakMap.has(keyObj)); // 输出: true
// 删除键值对
weakMap.delete(keyObj);
console.log(weakMap.has(keyObj)); // 输出: false
WeakMap 的特性
WeakMap 的键名是弱引用,不会阻止垃圾回收。当键名对象没有其他引用时,垃圾回收器会自动回收该对象,并从 WeakMap 中移除对应的键值对。
let keyObj = {};
const weakMap = new WeakMap();
weakMap.set(keyObj, 'value');
// 移除对 keyObj 的引用
keyObj = null;
// 垃圾回收后,weakMap 中的键值对会自动移除
WeakMap 的应用场景
WeakMap 常用于存储与对象关联的私有数据或元数据,而不会影响对象的生命周期。例如,可以在不修改对象本身的情况下,为其附加额外的信息。
const privateData = new WeakMap();
class MyClass {
constructor() {
privateData.set(this, { secret: 42 });
}
getSecret() {
return privateData.get(this).secret;
}
}
const instance = new MyClass();
console.log(instance.getSecret()); // 输出: 42
WeakMap 与 Map 的区别
WeakMap 和 Map 的主要区别在于键名的引用强度。Map 的键名是强引用,会阻止垃圾回收,而 WeakMap 的键名是弱引用,不会阻止垃圾回收。此外,WeakMap 不支持迭代或直接访问所有键值对。
const map = new Map();
const weakMap = new WeakMap();
let keyObj = {};
map.set(keyObj, 'map value');
weakMap.set(keyObj, 'weakmap value');
// 移除对 keyObj 的引用
keyObj = null;
// map 仍然保留键值对,weakMap 的键值对会被回收
注意事项
WeakMap 的键名必须是对象,不能是原始值(如字符串、数字等)。尝试使用非对象作为键名会抛出错误。
const weakMap = new WeakMap();
weakMap.set('primitive', 'value'); // 抛出 TypeError
浏览器兼容性
WeakMap 是 ES6 引入的特性,现代浏览器和 Node.js 环境均支持。在不支持的环境中,可以通过 polyfill 实现类似功能。







