持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第11天,点击查看活动详情
WeakSet(弱集合)含义
WeakSet(弱集合)是ES6新增的一种集合数据类型,其和Set类似,也是一种不重复值的集合,但是WeakSet中的元素只能够是对象类型的值,不能是其他类型的值,下述例子可以验证:
const ws = new WeakSet();
ws.add(1)
上述例子中可以看出,我们尝试向WeakSet集合ws中添加一个数字1的数据,执行后会抛出TypeError错误。下面我们来看下向WeakSet数据中添加一个对象的结果,如下:
const ws = new WeakSet()
const obj = { name: 1 }
ws.add(obj)
上述例子中,向WeakSet数据中添加一个对象数据{ name: 1 }可以执行成功,输出WeakSet信息时,可以看到当中已经有一个{ name: 1 }的元素,并可以看到WeakSet的实例方法。
WeakSet中的对象都是弱引用,弱集合数据中的弱(weak),描述的是JavaScript垃圾回收机制中对其的处理方式,即垃圾回收机制不考虑WeakSet对对象的引用,例如,WeakSet数据中引入了一个a对象,程序中的其他对象都没有对对象a的引用,那么垃圾回收程序就会回收对象a所占用的内存,而不会考虑对象a是否还在WeakSet数据当中。
WeakSet实例方法
WeakSet中主要有以下几种实例方法:
- WeakSet.prototype.add(value):向WeakSet中添加一个新元素
- WeakSet.prototype.delete(value):清除WeakSet中的元素
- WeakSet.prototype.has(value):该方法返回一个布尔值,检测某个元素是否存在WeakSet当中
上述几种实例方法的使用如下:
const ws = new WeakSet()
const obj = { name: 1 }
ws.add(obj)
ws.has(obj) // true
ws.delete(obj) // true
ws.has(obj) // false
刚我们说过垃圾回收机制不会考虑WeakSet对一个对象的引用,所以WeakSet当中有多少个元素就会依赖于垃圾回收机制有没有运行,垃圾回收前后WeakSet的元素个数可能是不一样的,但我们无法预测垃圾回收机制的时间,所以WeakSet这种数据结构是不能进行遍历操作的。