以前我们常用的es5现在越来越多人用es6或者es7,它们的一些方法能快速提高我们的开发效率。我们或许经常有使用map等,可是你又知道weakMap吗?下面我们来讲讲es6的weakSet 和weakMap。
一、由来
WeakSet和WeakMap的设计目的是为了解决内存泄漏的问题。在旧版本的JavaScript中,当我们创建一个对象并将其存储在某个数据结构中时,即使我们不再需要这个对象,它仍然会被数据结构保持引用,导致该对象无法被垃圾回收,从而造成内存泄漏。
二、定义
1、WeakSet:ES6中的WeakSet是一种集合数据结构,Set的变体,它只能存储对象类型的值,而不能存储原始值(如数字、字符串等)。
2、WeakMap:一种特殊的Map数据结构,它的键只能是对象,并且键是弱引用的。
二、区别
1、WeakSet
(1)一组对象的集合,其中的每个对象只能出现一次。
(2)一种有限的数据结构,它没有迭代器方法,也不能通过 for...of 循环来遍历元素 。
(3)没有内置的方法来获取其大小,也没有类似于数组的 length 属性。这是因为 WeakSet 中的元素数量是动态变化的,取决于垃圾回收机制何时回收不再被引用的对象。
(4)主要应用场景是存储一组对象,并且不希望这些对象影响垃圾回收。
(5)它不会增加其成员的引用计数,也就是说,不会因为WeakSet的存在而使成员值得引用计数增加。
(6)WeakSet存储的对象是弱引用的,当成员值不再被其他对象所引用时,成员值会被垃圾收集器回收。
2、WeakMap
(1)键只能是对象,不能是原始类型或者null。
(2)对于存储的键或值对象,如果没有其他引用持有它们,它们会自动被回收。
(3)WeakMap提供了一种机制,可以将一些与键关联的元数据与对象关联起来,而不会影响垃圾回收的过程。
(4)它的键是不会被垃圾回收机制所跟踪的。如果一个键所引用的对象的其他引用都被清除了,那么这个键值对会自动被删除
(5)不能直接获取WeakMap的大小,也没有size属性。
(6)不支持迭代方法,即没有keys、values和entries方法。
三、主要应用场景
1、WeakSet:需要存储一组对象引用,但不希望这些对象的存在阻止它们被垃圾回收的情况下使用。
2、WeakMap:在需要存储对象的附加信息,并且这些附加信息的生命周期受到对象自身的影响的情况下使用。
四、使用
1、WeakSet
其中,iterable
可选,表示一个可迭代对象,可以是一个数组等。
WeakSet的常用方法包括:
(1)add(value)
:在WeakSet中添加一个值。
(2)delete(value)
:从WeakSet中删除一个值。
(3)has(value)
:判断WeakSet中是否存在某个值。
例子如下:
应用例子:
(1)缓存管理
使用 WeakSet 可以方便地跟踪对象是否在缓存中。当对象不再被引用时,它会自动从 WeakSet 中移除,从而释放内存。
(2)监听管理器
在使用事件监听器或观察者模式时,可以将监听器对象存储在 WeakSet 中。当监听器对象不再被引用时,它会自动从 WeakSet 中移除,从而避免内存泄漏。
(3)DOM 节点管理
在处理网页上的 DOM 节点时,可以将节点对象存储在 WeakSet 中。当节点不再被引用时,它会自动从 WeakSet 中移除,从而释放内存。
2、WeakMap
例子:
应用例子:
在使用DOM元素作为键的情况下,当DOM元素从页面中移除时,对应的附加信息也会被自动删除,这样可以防止内存泄漏。