一句话说清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

公众号: 前端收藏家。只收藏好的,只推荐好的

相关文章
相关标签/搜索