除了Set
和Map
这两种新的数据结构,ES6还增加了它们的弱化版本,WeakSet
和WeakMap
。
基本上,Map
和Set
与其弱化版本之间仅有的区别是:
WeakSet
或WeakMap
类没有entries
、keys
和values
等方法;只能用对象作为键。
创建和使用这两个类主要是为了性能。WeakSet
和WeakMap
是弱化的(用对象作为键),没有强引用的键。这使得JavaScript的垃圾回收器可以从中清除整个入口。
另一个优点是,必须用键才可以取出值。这些类没有entries
、keys
和values
等迭代器方法,因此,除非你知道键,否则没有办法取出值。这印证了我们在第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
类。