一句話說清WeakMap的弱引用

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

公衆號: 前端收藏家。只收藏好的,只推薦好的

相關文章
相關標籤/搜索