JavaScript中的弱引用和强引用

  • 什么是弱引用和强引用
  • 举例说明弱引用和强引用
  • 在JavaScript中演示弱引用和强引用
  • 弱引用的特性总结

什么是弱引用和强引用

JavaScript 中强引用:对象的引用在 JavaScript 中是强引用,也就是将一个引用对象通过变量或常量保存时,那么这个变量或常量就是强引用,这个对象就不会被回收。

JavaScript 中弱引用: WeakMaps 和 WeakSets 是我们在 JavaScript 使用弱引用唯一途径,将一个对象作为键添加到 WeakMap 或 WeakSet 中并不能防止这些对象被回收。

举例说明弱引用和强引用

强引用就是一个小孩A牵着一条狗,他们之间通过狗链儿连着。

弱引用就是,旁边有个人B指着A牵的狗,说:嘿,那有条狗,B指向那条狗,但他们之间没有是指绑在一起的东西。

当A放开狗链,狗就会跑掉(被垃圾回收),无论B是不是还指着。

但是,当B不再指着那条狗,狗还被A牵着,不会影响它是否跑掉。

在JavaScript中演示弱引用和强引用

let people = {name:'张三',age:25}
let people1 = people;

在上面的代码中我们将{name:'张三',age:25}赋值给变量people时,在内存中会存在一根线将它们连接起来:


然后创建people1变量,将people赋值给people1,相当于people1也引用这个对象:

我们再来看当我们使用ES6新引入的类型WeakSet和WeakMap在存储引用值时,是一种什么样的情况。

let people = {name:'张三',age:25}
let people1 = people;let set = new WeakSet();
set.add(people);

我们新建了一个WeakSet()实例,通过add方法将添加了people,people对应的引用值是{name:'张三',age:25}

可以看到:set实例中的值{name:'张三',age:25}引用指向于{name:'张三',age:25}(在实际内存中他指向的是该数据的栈的指针引用,该栈指向对应堆中的对应的那个地址的值)。并且需要特别注意的是,这条弱引用的“线”是透明的,这是什么意思?他和强引用的区别在哪里?

一句话概述:强引用被{name:'张三',age:25}这个引用认可为一个“连接”,而弱引用不被认可。即该引用并不知道它被set实例所引用。

这说明垃圾回收也不知道该引用被set实例所引用。那么如果该引用的所有强引用连接都被断开了(变量被赋值为null或其他情况),那么该引用会被当作垃圾销毁,即使set实例还在引用着该引用。

let people = {name:'张三',age:25}
let people1 = people;let set = new WeakSet();
set.add(people);
people = null;
people1 = null;

我们把强引用都断开会出现什么情况呢?

因为所有的强引用都断开了,那么垃圾回收认为该引用{name:'张三',age:25}不需要了,就会将他销毁。那么对应的set实例所用到的该引用也都不复存在了,即使set实例还在使用着该引用。

弱引用的特性总结

1、WeakSet中对象的引用是弱引用,也就是说,即使weakset“引用”了某个对象,但垃圾回收不把这种引用计为“引用”,只要其他地方没有强引用这个对象,该对象就不可达,任何时刻可能被回收;只能存储引用类型,且不可枚举、不可清除。

2、WeakMap和Map相似,不过不可枚举、不可清空、对key所引用的对象是弱引用。

3、WeakSet 适合临时存放一组对象,以及存放跟对象绑定的信息。只要这些对象在外部消失,它在 WeakSet 里面的引用就会自动消失。 由于上面这个特点,WeakSet 的成员是不适合引用的,因为它会随时消失。

4、强引用有时会忘记取消引用,导致内存无法释放,进而可能会引发内存泄漏。而弱引用,不计入垃圾回收机制,所以就不存在这个问题。

JavaScript中的弱引用和强引用相关推荐

  1. c语言弱符号与函数指针,浅谈C语言中的强符号、弱符号、强引用和弱引用【转】...

    首先我表示很悲剧,在看<程序员的自我修养--链接.装载与库>之前我竟不知道C有强符号.弱符号.强引用和弱引用.在看到3.5.5节弱符号和强符号时,我感觉有些困惑,所以写下此篇,希望能和同样 ...

  2. java 软引用_Java中弱引用和软引用的区别以及虚引用和强引用介绍

    知道弱引用和软引用的概念与如何使用它们是两码事,引用类在垃圾回收工作的过程中有重要作用.我们都知道垃圾回收器会回收符合回收条件的对象的内存,但并不是所有的程序员都知道回收条件取决于指向该对象的引用类型 ...

  3. java 四种内存_不可访问内存 Java四种引用包括强引用,软引用,弱引用,虚引用...

    小结: 1.不可访问内存是指一组没有任何可访问指针指向的由计算机程序进行动态分配的内存块. 2.垃圾收集器能决定是否一个对象还是可访问的:任何被确定不可访问的对象将会被释放. https://zh.w ...

  4. Java四种引用包括强引用,软引用,弱引用,虚引用。

    强引用: 只要引用存在,垃圾回收器永远不会回收 Object obj = new Object(); //可直接通过obj取得对应的对象 如obj.equels(new Object()); 而这样 ...

  5. 一文带你搞懂Java的四大引用:强引用,软引用,弱引用以及虚引用

    Java中的引用 强引用Reference Reference类以及继承派生的类. 当内存不足,JVM开始垃圾回收,对于强引用的对象,就算是出现了OOM也不会对该对象进行回收,死都不收. 这样定义的默 ...

  6. android软引用如何使用方法,Android的四种引用(强引用、弱引用、软引用、虚引用)...

    前言:满纸荒唐言,一把辛酸泪:都云作者痴,谁解其中味. 一.概述 早在JDK1.2就把对象引用分为四种级别,从而使程序能更灵活控制它的生命周期,级别由高到底依次为:强 > 软 > 弱 &g ...

  7. java.强引用软引用,java 强引用、软引用、弱引用、虚引用-Go语言中文社区

    这篇文章的一个评论很有特点: 强引用: (一)强引用就是在程序代码之中普遍存在的,类似Object obj = new Object()这类的引用, 只要强引用还存在,垃圾收集器永远不会回收掉被引用的 ...

  8. GCC中的弱符号与强符号

    转载自 https://www.cnblogs.com/kernel_hcy/archive/2010/01/27/1657411.html 我们经常在编程中碰到一种情况叫符号重复定义.多个目标文件中 ...

  9. java基础-----弱引用,软引用,强引用,虚引用

    转自:http://www.cnblogs.com/blogoflee/archive/2012/03/22/2411124.html 1.概述 在JDK1.2以前的版本中,当一个对象不被任何变量引用 ...

最新文章

  1. H5视频之video.js播放rtmp直播源和hls直播源
  2. java 打包成服务_maven javaProject打包发布成服务
  3. Java类之File记录
  4. oracle database 12cr2 使用 dbms_stat 采集统计信息
  5. was、ihs、 mq、 db2的版本查询
  6. 修改内核配置解决busybox的mdev -s启动速度慢的问题
  7. lisp遍历表中所有顶点_三十张图片让你彻底弄明白图的两种遍历方式:DFS和BFS...
  8. jQuery Mobile教程:jQuery Mobile基本事件
  9. python显示gif图片报错_用Python制作在地图上模拟瘟疫扩散的Gif图
  10. 记一次失败的RecycleView滑动定位
  11. DOM和Events
  12. oracle 访问adf 慢,ORACLE ADF 问题总结
  13. 物联网5种无线传输协议特点大汇总
  14. Highcharts 将默认文字更改为中文
  15. html在线上传图片,kindeditor 图片上传
  16. 【微信小程序系列:三】前端实现微信支付与代扣签约
  17. 游戏音乐制作/游戏音效制作/游戏配音首选
  18. day002血字的研究
  19. 关闭eslint语法检查
  20. python图形显示不出来_Matplotlib无法显示图像的问题

热门文章

  1. 【ShaderLab】Phong与Blinn-Phong两个光照模型的理解
  2. 可以检测手机帧率和温度的软件_没有特异功能 手机软件是如何测得电池温度的...
  3. 红外目标图像中阈值分割方法的比较与研究
  4. 黑帽seo 模板生成php,2020最新黑帽SEO技术中排名稳定方法,万能采集模板CMS
  5. 基于HTML家乡主题网页项目的设计与实现——上海介绍(5页) HTML+CSS
  6. 古代一两银子到底值多少钱?
  7. 抬头,看!天融信面板AP解锁新姿势
  8. unity 5.x从入门到精通_Unity学习中值得收藏的学习资料(书籍)与博客
  9. Ehcache(缓存)
  10. python爬取直播_python selenium爬取斗鱼所有直播房间信息过程详解