WeakMap
WeakMap 和 Map 的第一個不同點就是,WeakMap 的鍵必須是對象,不能是原始值。
如果我們在 weakMap 中使用一個對象作為鍵,並且沒有其他對這個對象的引用 — 該對象將會被從內存(和map)中自動清除。
1 let john = { name: "John" }; 2 3 let weakMap = new WeakMap(); 4 weakMap.set(john, "..."); 5 6 john = null; // 覆蓋引用 7 // john 被從內存刪除了
WeakMap 不支持迭代以及 keys(),values() 和 entries() 方法。所以沒有辦法獲取 WeakMap 的所有鍵或值。
WeakMap 只有以下的方法:
weakMap.get(key)
weakMap.set(key, value)
weakMap.delete(key)
weakMap.has(key)
例如,我們有用於處理用戶訪問計數的代碼。收集到的信息被存儲在 map 中:一個用戶對象作為鍵,其訪問次數為值。當一個用戶離開時(該用戶對象將被垃圾回收機制回收),這時我們就不再需要他的訪問次數了。
1 // visitsCount.js 2 let visitsCountMap = new WeakMap(); // weakmap: user => visits count 3 4 // 遞增用戶來訪次數 5 function countUser(user) { 6 let count = visitsCountMap.get(user) || 0; 7 visitsCountMap.set(user, count + 1); 8 }
WeakSet
WeakSet 的表現類似:
與 Set 類似,但是我們只能向 WeakSet 添加對象(而不能是原始值)。
對象只有在其它某個(些)地方能被訪問的時候,才能留在 set 中。
跟 Set 一樣,WeakSet 支持 add,has 和 delete 方法,但不支持 size 和 keys(),並且不可迭代。
1 let jack = {name: "jack"}; 2 let weakSet = new WeakSet(); 3 weakSet.add(jack, 22); 4 console.log( weakSet.has(jack) ); // true 5 weakSet.delete(jack); 6 console.log( weakSet ); // WeakSet {}
