首页 » 学习JavaScript数据结构与算法(第2版) » 学习JavaScript数据结构与算法(第2版)全文在线阅读

《学习JavaScript数据结构与算法(第2版)》7.4 ES6WeakMap类和WeakSet类

关灯直达底部

除了SetMap这两种新的数据结构,ES6还增加了它们的弱化版本,WeakSetWeakMap

基本上,MapSet与其弱化版本之间仅有的区别是:

  • WeakSetWeakMap类没有entrieskeysvalues等方法;

  • 只能用对象作为键。

创建和使用这两个类主要是为了性能。WeakSetWeakMap是弱化的(用对象作为键),没有强引用的键。这使得JavaScript的垃圾回收器可以从中清除整个入口。

另一个优点是,必须用键才可以取出值。这些类没有entrieskeysvalues等迭代器方法,因此,除非你知道键,否则没有办法取出值。这印证了我们在第3章的做法,即使用WeakMap类封装ES6类的私有属性。

使用WeakMap类的例子如下:

var map = new WeakMap;var ob1 = {name:'Gandalf'}, //{1}    ob2 = {name:'John'},    ob3 = {name:'Tyrion'};map.set(ob1, '[email protected]'); //{2}map.set(ob2, '[email protected]');map.set(ob3, '[email protected]');console.log(map.has(ob1)); //{3} 输出trueconsole.log(map.get(ob3)); //{4} 输出[email protected]map.delete(ob2); //{5}  

WeakMap类也可以用set方法,但不能使用数字、字符串、布尔值等基本数据类型,需要将名字转换为对象(行{1}和行{2})。

搜索(行{3})、读取(行{4})和删除值(行{5}),也要传入作为键的对象。

同样的逻辑也适用于WeakSet类。