你真的了解es6 的weakSet 与weakMap吗?

以前我们常用的es5现在越来越多人用es6或者es7,它们的一些方法能快速提高我们的开发效率。我们或许经常有使用map等,可是你又知道weakMap吗?下面我们来讲讲es6的weakSetweakMap

一、由来

        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元素从页面中移除时,对应的附加信息也会被自动删除,这样可以防止内存泄漏。

  • 10
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值