除了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} 輸出true
console.log(map.get(ob3)); //{4} 輸出[email protected]
map.delete(ob2); //{5}
WeakMap
類也可以用set
方法,但不能使用數字、字符串、布爾值等基本數據類型,需要將名字轉換為對像(行{1}
和行{2}
)。
搜索(行{3}
)、讀取(行{4}
)和刪除值(行{5}
),也要傳入作為鍵的對象。
同樣的邏輯也適用於WeakSet
類。