美文网首页让前端飞Web前端之路
一句话说清WeakMap的弱引用

一句话说清WeakMap的弱引用

作者: 前端收藏家 | 来源:发表于2020-06-05 08:47 被阅读0次

WeakMap的引用是弱引用,gc的时候会忽略这种引用。即如果一个对象只有这种弱引用的时候,
会直接被垃圾回收掉。

我们用代码看下和Map的差别,

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:

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。是这种弱引用特性导致的。

还是以上面那个例子说明,当obj=null的时候,如果垃圾回收器没有执行,那么这个时候weakmap.get(obj)其实是有值的,但如果垃圾回收器执行过了,你再访问weakmap.get(obj)就是返回undefined了。

所以这就导致了WeakMap无法遍历所有key的问题。

希望这些可以帮你理解掌握该在什么时候用WeakMap,什么时候用Map。

相关文章

  • 一句话说清WeakMap的弱引用

    WeakMap的引用是弱引用,gc的时候会忽略这种引用。即如果一个对象只有这种弱引用的时候,会直接被垃圾回收掉。 ...

  • 深拷贝

    准备 WeakMap类型WeakMaps 保持了对键名所引用的对象的弱引用,而且WeakMap 只接受对象作为键名...

  • 24.WeakMap

    WeakMap WeakMap 是 Map 的弱引用,它也是在 Map 的基础上有了一些限制和自己的特性。 没有 ...

  • ES6新增WeakRef和FinalizationRegistr

    WeakRef WeakSet 和 WeakMap 是基于弱引用的数据结构,ES2021[https://gith...

  • WeakMap和Map内存回收对比

    WeakMap WeakMap 对象是一组键/值对的集合,其中的键是弱引用的。其键必须是对象,而值可以是任意的。W...

  • 弱引用之WeakMap和WeakRef

    弱引用:只要有对象引用,他就不会被垃圾回收。介绍之前,不了解这些概念的同学可以参考一下以下链接。 WeakMaph...

  • WeakMap和WeakSet

    WeakMap 只接受对象最为键名(null 除外),不接受其他类型的值作为键名; 键名是弱引用,键值可以是任意的...

  • Map、WeakMap、Set、WeakSet

    ES6引入了四种新的数据结构:映射(Map)、集合(Set)、弱集合(WeakSet)和弱映射(WeakMap) ...

  • iOS基础-弱引用

    实现弱引用 本文将整理 弱引用、强引用的定义 为什么会出现“弱引用” weak 实现原理 实现弱引用的N种方法 如...

  • weak原理

    weak原理 弱引用指针添加到弱引用表。 NSObject.mm 弱引用的指针存储到弱引用表 通过哈希运算找到弱引...

网友评论

    本文标题:一句话说清WeakMap的弱引用

    本文链接:https://www.haomeiwen.com/subject/ieypzhtx.html