weakSet垃圾回收机制

时间: 2020-01-03阅读: 190标签: 机制

WeakSet对象

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

  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));
站长推荐

1.阿里云: 本站目前使用的是阿里云主机,安全/可靠/稳定。点击领取2000元代金券、了解最新阿里云产品的各种优惠活动点击进入

2.腾讯云: 提供云服务器、云数据库、云存储、视频与CDN、域名等服务。腾讯云各类产品的最新活动,优惠券领取点击进入

3.广告联盟: 整理了目前主流的广告联盟平台,如果你有流量,可以作为参考选择适合你的平台点击进入

链接: http://www.fly63.com/article/detial/8502

简单梳理Redux的源码与运行机制

前几天写了一篇react另一个状态管理工具Unstated的源码解析。开启了我的看源码之路。想一想用了好长时间的redux,但从没有深究过原理,遇到报错更是懵逼,所以就啃了一遍它的源码,写了这篇文章,

这一次,彻底弄懂 JavaScript 执行机制

javascript是一门单线程语言,Event Loop是javascript的执行机制.牢牢把握两个基本点,以认真学习javascript为中心,早日实现成为前端高手的伟大梦想!

Javascript中的执行机制_Event Loop

众所周知,Javascript是单线程语言, 这就意味着,所有的任务都必须按照顺序执行,只有等前面的一个任务执行完毕了,下一个任务才能执行。如果前面一个任务耗时很长,后一个任务就得一直等着,因此,为了实现主线程的不阻塞,就有了Event Loop。

浅出Vue 错误处理机制errorCaptured、errorHandler

JavaScript本身是一个弱类型语言,项目中容易发生错误,做好网页错误监控,能帮助开发者迅速定位问题,保证线上稳定。vue项目需接入公司内部监控平台,本人之前vue errorHooks不甚了解, 决定探一探

浅谈小程序运行机制

接触小程序有一段时间了,总得来说小程序开发门槛比较低,但其中基本的运行机制和原理还是要懂的。“比如我在面试的时候问到一个关于小程序的问题,问小程序有window对象吗?

理解Redis的内存回收机制

Redis的过期策略都有哪些?内存淘汰机制都有哪些?手写一下LRU代码实现?笔者结合在工作上遇到的问题学习分析,希望看完这篇文章能对大家有所帮助。

TypeScript 的 类型保护机制

在编写 TS 时,它做了比我们看到的更多的事情,例如类型保护机制。让我们编写的代码更加严谨,至于怎么回事,让我们来看看吧。由于这些机制的存在,就算你仍旧以 JS 原生的书写方式,也能帮助你提前发现代码中潜在的问题。

React事件机制-事件分发

之前讲述了事件如何绑定在document上,那么具体事件触发的时候是如何分发到具体的监听者呢?我们接着上次注册的事件代理看。当我点击update counter按钮时,触发注册的click事件代理。topLevelType为click,nativeEvent为真实dom事件对象。

小程序的更新机制_如何实现强制更新?

在讲小程序的更新机制之前,我们需要先了解小程序的2种启动模式,分别为:冷启动和热启动。小程序不同的启动方式,对应的更新情况不不一样的。无论冷启动,还是热启动。小程序都不会马上更新的,如果我们需要强制更新,需要如何实现呢?

Node.js之模块机制

其实在JavaScript的发展中,它主要是在浏览器前端中被应用广泛。因为在实际应用中, JavaScript的表现能力主要取决于宿主环境的API支持程度, 在最早期,只有对BOM, DOM的支持,随着HTML5的出现,在浏览器中出现了更多

内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!

文章投稿关于web前端网站点搜索站长推荐网站地图站长QQ:522607023

小程序专栏: 土味情话心理测试脑筋急转弯幽默笑话段子句子语录成语大全运营推广