weakSet垃圾回收机制

我的未来我决定 提交于 2020-04-06 09:27:27

WeakSet对象

差异性WeakSetSet类似,都是去重有序聚合数据。但有两点不同:

  1. WeakSet成员只能是对象,不能是其它类型的数据。
  2. 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));
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!