[JS]WeakMap和WeakSet


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 {}




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM