讀古今文學網 > 學習JavaScript數據結構與算法(第2版) > 7.4 ES6WeakMap類和WeakSet類 >

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} 輸出true
console.log(map.get(ob3)); //{4} 輸出[email protected]
map.delete(ob2); //{5}

  

WeakMap類也可以用set方法,但不能使用數字、字符串、布爾值等基本數據類型,需要將名字轉換為對像(行{1}和行{2})。

搜索(行{3})、讀取(行{4})和刪除值(行{5}),也要傳入作為鍵的對象。

同樣的邏輯也適用於WeakSet類。