WeakSet是什么?
WeakSet 和 Set 类似,都是不重复的值的集合,但是和 Set 有两点不同:
- WeakSet 的成员只能是对象
- WeakSet 的对象都是弱引用
即WeakSet 中对对象的引用不会被考虑进垃圾回收机制,即只要没有其他的对象引用该对象,则该对象就会被回收,而不管它在不在 WeakSet
(由于这个特性,所以 WeakSet 适合临时存放一组对象和跟对象绑定的信息)
- => 3. WeakSet 没有size属性,没法遍历(故没有 forEach 方法)
因为 WeakSet 中有多少个成员取决于(没有其他对象对WeakSet成员的引用后)垃圾回收机制有没有运行,运行前后可能成员的个数是不一样的,而垃圾回收机制何时运行是不可预测的,所以 ES6 规定 WeakSet 不能被遍历
WeakSet 的应用场景/ 好处
用于存储DOM节点,而不用担心这些节点从文档移除时会引发内存泄露
即可以用来避免内存泄露的情况
例子:
const foos = new WeakSet()
class Foo {
constructor() {
foos.add(this)
}
method() {
if(!foos.has(this)) {
throw new TypeError("Foo.prototype..method 只能在Foo的实例上调用")
}
}
}
//
这段代码的作用是保证了Foo 的实例方法只能在Foo的实例上调用。
// 这里用WeakSet的好处:数组foos对实例的引用不会被计入内存回收机制,所以删除实例时无需考虑foos, 也不会出现内存泄露
WeakSet 的语法
- WeaSet 是一个构造函数,通过
new WeakSet()
可生成一个实例
const ws = new WeakSet();
WeakSet作为构造函数:可接收数组或类数组对象作为其参数:则数组的所有成员 都会自动成为 WeakSet 对象的成员
注:
(1) 数组的成员只能是对象(因为WeakSet的成员只能是对象)
(2) 成为 WeakSet 的成员的是数组的成员,而不是数组本身。
- WeakSet 有三个方法:add, delete, has
WeakSet.prototype.add(value)
向WeakSet 实例添加一个成员
WeakSet.prototype.delete(value)
清除 WeakSet 实例的指定成员
WeakSet.prototype.has(value)
判断某个值是否在WeakSet 实例中,返回布尔值