WeakSet和Set都是不重複的值的集合。
WeakSet和Set有兩點不一樣。
一、WeakSet的成員只能是對象,Set的成員不只能夠是對象還能夠是其餘類型的值。函數
二、WeakSet中的對象都是弱引用,垃圾回收機制不考慮WeakSet對該對象的引用,即,若是其餘對象再也不引用該對象,垃圾回收機制會自動回收該對象所佔用的內容,不用考慮該對象是否還存在於WeakSet中。spa
垃圾回收:
垃圾回收機制是依賴引用計數,若是一個值的引用次數不爲0,垃圾回收機制是不會釋放這塊內存的。code
當結束使用該值以後,若是忘記取消引用,會致使內存沒法釋放,進而可能引起內存泄漏。而WeakSet永遠,不會出現內存泄漏的問題。由於WeakSet裏面的引用是不計入垃圾回收機制的。WeakSet適合臨時存放一組對象,以及存放跟對象綁定的信息。只要對象在外部消失,它在WeakSet裏面的引用就會自動消失。對象
WeakSet沒有size屬性,也沒有辦法遍歷其成員。
有三個操做方法:
add(value),delete(value),has(value)事件
WeakSet不能遍歷的一個緣由是:全部成員都是弱引用,隨時可能消失,遍歷機制沒法保證成員存在,可能剛遍歷結束,成員就取不到了。
WeakSet的一個最大的用處是:存儲DOM結點,不用擔憂這些這些節點從文檔中刪除,引起內容泄露。ip
WeakMap和WeakSet類似,只要外部引用消失,WeakMap內部的引用就會自動被垃圾回收清除。
WeakMap平常最大的應用:(註冊監聽事件的listener對象很適合用WeakMap實現)
由於將監聽函數放在WeakMap中,一旦DOM對象消失,與它綁定的監聽函數也會自動消失。內存
let myElement = document.getElementById('logo'); let myWeakmap = new WeakMap(); myWeakmap.set(myElement,{timesClicked:0}); myElement.addEventListener('click',function(){ let logoData = myWeakmap.get(myElement); logoData.timesClicked++; },false);