- WeakMap 只接受对象作为键名
const map = new WeakMap();
map.set(1, 2); // error
map.set(null, 2); // error
- WeakMap 的键名所引用的对象是弱引用
在js中一般我们建立一个对象都是建立一个强引用
var obj = new Object();
只有当我们手动设置 obj = null 的时候,才有可能回收obj所引用的对象
如果我们创建一个弱引用的对象,我们什么都不用做,只用 静静的等待垃圾回收机制执行,obj所引用的对象就会被回收
- 在DOM对象上保存相关数据
let wm = new WeakMap();
let element = document.querySelector('.element');
wm.set(element,'data');
let value = wm.get(element);
console.log(value); // data
element.parentNode.removeChild(element);
element = null;
- 数据缓存
在不修改原有对象的情况下储存某些属性或者根据对象储存一些计算的值,而又不想管理这些数据的死活时非常适合考虑使用 WeakMap
const cache = new WeakMap();
function countOWnKeys (obj) {
if(cache.has(obj)) {
console.log('Cached');
return cache.get(obj);
}else {
console.log('Computed');
const count = Object.keys(obj).length;
cache.set(obj,count);
return count;
}
}
- 私有属性
WeakMap 也可以被用作实现私有属性
const privateData = new WeakMap();
class Person {
constructor(name, age) {
privateData.set(this, { name: name, age: age });
}
getName() {
return privateData.get(this).name;
}
getAge() {
return privateData.get(this).age;
}
}
export default Person;