ES6 - WeakMap

Set有对应的WeakSet, Map也有WeakMap。这一篇,我们就来学习一下WeakMap有写什么特性。
先来看一下WeakMap的基本特性

1: WeakMap是一种存储多个键值对的无序列表
2: WeakMap的键必须是非null的对象类型
3: WeakMap的键对应的值,可以是任意类型

接下来看一下WeakMap的接口方法:
一:WeakMap的新建与初始化
与Map相同的,WeakMap也可以通过new WeakMap()新建和初始化:

let weakMap1 = new WeakMap();
let key1 = {};
let key2 = {};
let weakMap2 = new WeakMap([[key1, 'key1'],[key2, 'key2']]);

只是与Map不同,WeakMap的key必须是对象,不能是原始类型。

二:WeakMap的增删查减
WeakMap的接口函数与Map基本一致,只是没有clear()方法:

1: set(key, value) 添加一个键值对
2: get(key) 获取key对应的value
3: has(key) 判断key是否存在于WeakMap
4: delete(key) 移除key对应的键值对

下面我们看一个用了以上所有方法的示例:

let weakMap = new WeakMap();
let key1 = {'id': 1};
let key2 = {'id': 2};

weakMap.set(key1, {'name': 'mike'});
weakMap.set(key2, {'name': 'lily'});
console.log(weakMap.get(key1)); //{name: "mike"}
console.log(weakMap.has(key1)); //true
weakMap.delete(key1);
console.log(weakMap);

最后一行代码的打印结果为:

WeakMap {{…} => {…}}
__proto__: WeakMap
[[Entries]]: Array(1)
0: {Object => Object}
key: {id: 2}
value: {name: "lily"}
length: 1

三:WeakMap的限制

1: WeakMap没有size属性
2: WeakMap在初始化或者调用set()的时候,key必须为非null对象,不然会抛出错误
3: WeakMap是不可枚举的,所以没有clear(), forEach()方法,不能在for...of环境下使用

四:WeakMap的使用场景
我们前面说到WeakMap的key必须要是非null的对象,WeakMap存储的key也是对象的弱引用,如果在此之外不存在其他强引用,JavaScript的引擎的垃圾回收机制会自动回收这个对象。而key对应的value如果是对象的话,那依然存储的对象的强引用。

所以当你遇到一个需要用到存储键值对的场景,在Map和WeakMap之间你需要权衡的点有:

1:你是否需要用对象做key,如果是,那么WeakMap是比Map更好的选择
2: 如果你选择的WeakMap,你功能的实现是否不受限与WeakMap本身的限制(也就是我们前面说到的‘三:WeakMap的限制’)。

以上就是WeakMap的基本特殊和使用方法以及场景。

你可能感兴趣的:(javascript)