weakSet垃圾回收机制
WeakSet对象
差异性:WeakSet与Set类似,都是去重有序聚合数据。但有两点不同:
- WeakSet成员只能是对象,不能是其它类型的数据。
- WeakSet成员对象都是弱引用,即垃圾回收机制不会考虑WeakSet对象对该对象的引用。
如果其它对象没有引用该对象,垃圾回收机制会自动回收该对象所占的内存,不会考虑该对象是否还在WeakSet对象中。 正是由于以上特性,WeakSet中的成员对象会随时消失(垃圾回收机制运行前后可能会不同)
语法:new WeakSet([iterable])
- iterable 数组,类数组(或者实现了迭代器接口的数据)
WeakSet 实例方法简表: 方法|说明 :-:|--- add() | 为WeakSet添加一个成员 delete() | 从WeakSet中删除一个成员 has() | 判断WeakSet中是否存在某个成员 b
注:正是由于WeakSet的弱引用特征,我们可以用它来存储dom,这样就不用担心DOM被页面中删除不会泄露在内存中的问题了。
创建weakset
//创建weakSet
let ws = new WeakSet([["1","2",3]])
let arr = [1,3,4]
// null也是不合法的
let ws2 = new WeakSet([[1,2],{color:"red"},()=>{},arr])
console.log(ws,ws2)
WeakSet的方法
//===添加
let arr = [1,3,4]
let ws2 = new WeakSet([[1,2],{color:"red"},()=>{},arr])
ws2.add(window).add(location)
console.log(ws2)
//删除
// let ws2 = new WeakSet([[1,2],{color:"red"},()=>{},arr])
console.log(ws2.delete(window))//true
console.log(ws2.delete(window))//false
//判断是否存在
console.log(ws2.has(window))//false
console.log(ws2.has(location))//true
console.log(ws2)
WeakSet垃圾回收机制
// 定义对象
// let ickt = [];
let ws = new WeakSet();
// 类
class Demo {
// 构造函数
constructor(color) {
this.color = color;
// 存储实例对象
// ickt.push(this)
// 用ws存储this就避免了对实例的引用
ws.add(this)
}
// 获取颜色方法
getColor() {
// if (ickt.indexOf(this) === -1) {
// // 抛出错误
// throw new Error('该对象不是Demo的实例,不能使用该方法')
// }
if (!ws.has(this)) {
// 抛出错误
throw new Error('该对象不是Demo的实例,不能使用该方法')
}
return this.color;
}
}
let d1 = new Demo('red')
let d2 = new Demo('green')
let obj = { color: 'pink' }
// 删除d2, d2原来的实例就应该被内存处理。但是没有处理
d2 = null;
// 获取颜色
console.log(d1.getColor());
// 让this指向d2
console.log(d1.getColor.call(d2));
// 让this指向obj
console.log(d1.getColor.call(obj));本文内容仅供个人学习、研究或参考使用,不构成任何形式的决策建议、专业指导或法律依据。未经授权,禁止任何单位或个人以商业售卖、虚假宣传、侵权传播等非学习研究目的使用本文内容。如需分享或转载,请保留原文来源信息,不得篡改、删减内容或侵犯相关权益。感谢您的理解与支持!