JavaScript学习-WeakSet

一、什么是 WeakSet?

  WeakSet 是一个类似于 Set 的数据结构,它和 Set 的不同有两点:

  * 是它里面保存的数据必须是对象,不能是其他类型的值。如果添加其他的值将会报错;

  * 它里面对象的引用是 弱引用,也就是说垃圾回收机制回收垃圾的时候是不会考虑它里面对对象的引用,如果其他的对象不再引用它里面的对象,那么垃圾回收机制会回收这个对象,不会考虑这个对象是否还存在于 WeakSet 里面。

  因为垃圾回收机制是依赖于引用计数的,如果一个值的引用次数不为零,那么这个对象就不会被垃圾回收机制回收,结束该使用值之后,有时候会忘记取消引用,导致内存无法被释放,进而引起内存泄漏。WeakSet 里面的引用时不会被计入引用计数的,所以就不会存在这个问题,因此, weakSet 适用于临时存放一组对象,以及存放和对象绑定的信息,只要这些对象在外部消失,那么它在 weakset 里面的引用也会自动消失。

  因为上面这个特点,所以 weakset 的对象是不适合被引用的,因为它里面的值随时都有可能消失。另外,weakset 里面有多少个对象是完全取决于垃圾回收机制有没有运行,运行前后可能成员的个数是不一样的,而垃圾回收机制是不可以预测的,因此 ,es6 规定 weakset 是不可以被遍历。这些特点同样使用于后面的 weakMap.

二、语法

  WeakSet 是一个构造函数,可以使用 new 命令来创建 WeakSet 实例对象,如下:

  const weakset = new WeakSet();

  作为一个构造函数, WeakSet 构造函数可以接受一个数组来作为参数,注意:它构造函数里面参数不是数组本身,而是数组里面的对象,因此数组里面必须是对象类型的数据,而不能是基本类型的数据。

  WeakSet 是不能遍历数据的,因为对象都是弱引用,随时都可能失效,遍历机制无法保证数据是否存在,可能刚遍历处理,数据就消失了。WeakSet 的一个作用就是存储 Dom 节点,而不用担心 这些节点从文档移除的时候 会引发内存泄漏。

  具体的方法和属性可以查看: https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/WeakSet