在 JavaScript 中,WeakMap 是一种特殊的 Map 数据结构,它允许将对象作为键,而且键值对是弱引用的关系。
与 Map 不同的是,WeakMap 的键只能是对象,不能是其他类型的值。同时,当键对象没有任何引用时,它们会被垃圾回收机制自动清除,这意味着 WeakMap 并不会导致内存泄漏。
弱引用的特性使得 WeakMap 在某些情况下非常有用,比如在需要将一些额外的数据与一个对象关联起来但又不希望影响到垃圾回收的场景下。常见的应用场景包括缓存、存储私有数据等。
WeakMap 的主要方法和属性与 Map 一致,包括 set、get、has、delete 等方法,但没有 size 属性。
以下是一个使用 WeakMap 的示例:
const wm = new WeakMap();
let obj1 = {name: 'John'};
let obj2 = {name: 'Jane'};
wm.set(obj1, 10);
wm.set(obj2, 20);
console.log(wm.get(obj1)); // 输出 10
console.log(wm.get(obj2)); // 输出 20
obj1 = null;
console.log(wm.get(obj1)); // 输出 undefined,obj1 已被垃圾回收
需要注意的是,由于 WeakMap 的键只能是对象,因此不能使用原始类型的值作为键,比如字符串、数字等。如果需要使用字符串或数字作为键,应该使用普通的 Map 数据结构。