WeakMap的引用是弱引用,gc的時候會忽略這種引用。即若是一個對象只有這種弱引用的時候,
會直接被垃圾回收掉。前端
咱們用代碼看下和Map的差異,code
let obj = { name: 'fedaily' } const map = new Map() map.set('account', obj) map.get('account') // { name: 'fedaily' } obj = null // 這裏將obj置爲null map.get('account') // 這裏其實obj值還在 { name: 'fedaily' }
從Map這個例子能夠看出來,obj被map一直引用着,那麼垃圾回收器處理時認爲{ name: 'fedaily' }還有其餘引用,就不會回收它。若是須要完全刪除它,須要map.delete('account')。對象
咱們再來看下WeakMap:get
let obj = { name: 'fedaily' } const weakmap = new WeakMap() weakmap.set(obj, 'account') // WeakMap的key必須是對象,具體用法這裏不展開,能夠看MDN上的介紹 weakmap.get(obj) // { name: 'fedaily' } obj = null // 這裏將obj置爲null weakmap.get('account') // undefined 這裏就沒有了
這裏當咱們將obj置爲null的時候,obj整個就被垃圾回收了。包括weakmap裏面保存的值。垃圾回收
經過這兩個對比,咱們很容易理解WeakMap描述的對鍵對象的引用是弱引用的含義。遍歷
WeakMap還有一個特性就是沒法遍歷全部的key。是這種弱引用特性致使的。map
仍是以上面那個例子說明,當obj=null的時候,若是垃圾回收器沒有執行,那麼這個時候weakmap.get(obj)實際上是有值的,但若是垃圾回收器執行過了,你再訪問weakmap.get(obj)就是返回undefined了。引用
因此這就致使了WeakMap沒法遍歷全部key的問題。gc
但願這些能夠幫你理解掌握該在何時用WeakMap,何時用Map。co
公衆號: 前端收藏家。只收藏好的,只推薦好的