Skip to content

Latest commit

 

History

History
83 lines (58 loc) · 1.72 KB

7.WeakMap.md

File metadata and controls

83 lines (58 loc) · 1.72 KB

特性

  1. WeakMap 只接受对象作为键名
const map = new WeakMap();

map.set(1, 2); // error

map.set(null, 2); // error
  1. WeakMap 的键名所引用的对象是弱引用

在js中一般我们建立一个对象都是建立一个强引用

var obj = new Object();

只有当我们手动设置 obj = null 的时候,才有可能回收obj所引用的对象

如果我们创建一个弱引用的对象,我们什么都不用做,只用 静静的等待垃圾回收机制执行,obj所引用的对象就会被回收

应用

  1. 在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;
  1. 数据缓存

在不修改原有对象的情况下储存某些属性或者根据对象储存一些计算的值,而又不想管理这些数据的死活时非常适合考虑使用 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;
    }
}
  1. 私有属性

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;