ES6中的 WeakMap 是一种新的集合类型,在功能上类似于 Map,但是它只接受对象作为键(key)。WeakMap 中的键必须是对象,而值可以是任何类型的数据。WeakMap 的特点是它的键是弱引用的,即如果键对象被垃圾回收,则该键值对会从 WeakMap 中自动删除,这样可以避免内存泄漏。
实际用途应用示例
WeakMap 主要用于存储对象与对象之间的一些关联信息,它的主要应用场景有以下几个:
私有变量 WeakMap 可以用于模拟一些私有变量的实现,即用 WeakMap 存储对象的私有变量,只有对应的对象可以访问它们。
const privateData = new WeakMap();
class Person {
constructor(name, age) {
privateData.set(this, { name, age });
}
getName() {
return privateData.get(this).name;
}
getAge() {
return privateData.get(this).age;
}
}
缓存WeakMap 可以用于缓存一些对象的计算结果,这样可以避免重复计算
const cache = new WeakMap();
function countChars(str) {
if (cache.has(str)) {
return cache.get(str);
}
const count = str.length;
cache.set(str, count);
return count;
}
数据缓存WeakMap 可以用于存储一些数据,这些数据可以在对象被垃圾回收时自动删除。
const dataCache = new WeakMap();
function getData(obj) {
if (dataCache.has(obj)) {
return dataCache.get(obj);
}
const data = fetchData(obj);
dataCache.set(obj, data);
return data;
}