WeakSet 和 WeakMap
参考:https://juejin.cn/post/6844903959283367950?share_token=22940025-17cb-4d07-a81c-4120f92c07e4#heading-14
先介绍下 set 和 map
- Set:ES6 新增的一种新的数据结构,类似于数组,但成员是唯一且无序的,没有重复的值。
- map:
WeakSet:
WeakSet 对象允许你将弱引用对象储存在一个集合中。
- 应用场景:
- 储存DOM节点:DOM节点被移除时自动释放此成员,不用担心这些节点从文档移除时会引发内存泄漏
- 临时存放一组对象或存放跟对象绑定的信息:只要这些对象在外部消失,它在
WeakSet结构中的引用就会自动消
WeakMap:
WeakMap 对象是一组键值对的集合,其中的键是弱引用对象,而值可以是任意。
注意,WeakMap 弱引用的只是键名,而不是键值。键值依然是正常引用。
- 特性:
-
键的类型:WeakMap只接受对象作为键(null除外),不接受其他类型的值作为键。
-
弱引用:WeakMap的键是弱引用,键所指向的对象可以被垃圾回收(GC)回收。当对象的其他引用都被清除时,WeakMap中的键值对会自动消失,不需要手动删除引用。
-
不可遍历:由于WeakMap的键是弱引用,内部成员的数量取决于垃圾回收机制的执行,因此WeakMap不能被遍历。(递归遍历循环引用就是使用weakmap这个特性实现的)
-
- 应用场景:
- 储存DOM节点:DOM节点被移除时自动释放此成员键,不用担心这些节点从文档移除时会引发内存泄漏
- 部署私有属性:内部属性是实例的弱引用,删除实例时它们也随之消失,不会造成内存泄漏
总结:这种弱引用应该就是为了解决 DOM这种 循环引用时,无法被被垃圾回收的引用方式而出现的。DOM销毁时,弱引里面对应的DOM对象也会被回收掉。
个人理解: WeakMap设计的目的应该是就是给对象添加元数据的吧。将数据绑定到对象上,对这个对象却是弱引用。避免无法垃圾回收。

浙公网安备 33010602011771号