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));
来源:oschina
链接:https://my.oschina.net/u/4162046/blog/3216394