一.WeakSet的使用
只能存放对象类型,不能存放基本数据类型
const weakSet = new WeakSet()
weakSet.add(10)
//报错 Invalid value used in weak set
对元素的引用是弱引用,如果没有其他对象引用,GC会对该对象进行回收
const weakSet = new WeakSet()
const obj = {
name:'zhangsan'
}
weakSet.add(obj)
obj = null // 当赋值null的时候,即使weakSet指向该对象,obj指向的对象依然会被回收
不允许遍历,因为遍历的时候会有指针指向该对象,会对GC回收造成影响
WeakSet { <items unknown> }
所以存储带weakSet的数据是无法获取的,在现实开发中应用场景并不多,我举个例子:
const weakSet = new WeakSet()
class Person{
constructor(){
weakSet.add(this)
}
running(){
if(!weakSet.has(this)) throw new Error("不能通过其他对象调用running方法")
console.log("runing",this);
}
}
const p = new Person()
p.running.call({name:'zhangsna',age:15})
当我们显示绑定this到另外一个对象的时候,会抛出异常
二.WeakMap的用法
WeakMap的key只能使用对象,不能使用其他类型
const weakMap = new WeakMap()
weakMap.set(1,"Lina")
//Invalid value used as weak map key
对元素的引用是弱引用,如果没有其他对象引用,GC会对该对象进行回收--------类似WeakMap
不允许遍历--------类似WeakMap
应用场景:
Vue3的响应式原理用的就是Weakmap