js 弱引用,java 强引用 弱引用
本文为大家带来了一些关于javascript的知识,主要介绍了一些关于弱引用和强引用的相关问题,包括什么是弱引用和强引用,以及弱引用的特点总结等。下面就一起来看看吧,希望对你有所帮助。
【相关推荐:javascript视频教程,web前端】
什么是弱引用和强引用
JavaScript中的强引用:对象的引用在JavaScript中是强引用,即当引用的对象通过变量或常量保存时,那么该变量或常量就是强引用,对象不会被回收。
JavaScript中弱引用:WeakMap和WeakSet是在JavaScript中使用弱引用的唯一方式,将一个对象作为键添加到weak map或weak set不能防止这些对象被回收。
举例说明弱引用和强引用
强有力的引用是一个小孩A牵着一只狗,他们被一条狗链连接在一起。
弱引用就是B旁边有一个人指着A牵的狗说,嘿,那有只狗。指着那只狗,但是它们之间没有任何东西意味着有东西绑在一起。
A一松手狗链,狗就跑了(被垃圾收了),不管B还指不指。
但是当B不再指着狗的时候,狗还是被A牵着走,不会影响它跑不跑。
在JavaScript中演示弱引用和强引用
让人={姓名:张三,年龄:25}
让people1=人;在上面的代码中,当我们将{姓名:张三,年龄:25}赋给变量people时,内存中会有一行将它们连接起来:
然后创建people1变量并将人员分配给people1,这相当于people1也引用该对象:
让我们来看看,当我们使用ES6新引入的WeakSet和WeakMap类型来存储参考值时,是一种什么样的情况。
Let={姓名:张三,年龄:25}
让people1=人;
let set=new weak set();
set.add(人);我们已经创建了WeakSet()的新实例,并通过add方法添加了人员。人对应的参考值是{姓名:张三,年龄:25}。
可以看出,set实例中的值{name:张三,age:25}指的是{name:张三,age:25}(在实际内存中,他指的是数据的栈的指针引用,指向对应堆中对应地址的值)。而且需要注意的是,这条弱引用的“线”是透明的。这是什么意思?他和强报价有什么区别?
总结:强引用被引用{姓名:张三,年龄:25}识别为“连接”,弱引用不被识别。也就是说,引用不知道它被set实例引用。
这表明垃圾收集不知道该引用被set实例引用。然后,如果该引用的所有强引用连接都断开(变量被赋值为null或其他),则该引用将作为垃圾被销毁,即使set实例仍在引用该引用。
Let={姓名:张三,年龄:25}
让people1=人;
let set=new weak set();
set.add(人);
people=null
people1=null当我们断开所有强引用时会发生什么?
因为所有的强引用都坏了,垃圾回收会销毁不需要的引用{姓名:张三,年龄:25}。则相应集合实例使用的引用不再存在,即使该集合实例仍在使用该引用。
:
弱引用的特性总结
1.WeakSet中对象的引用是弱引用。也就是说,即使weakset“引用”了一个对象,垃圾回收也不会把这个引用算作“引用”。只要在别处没有对这个对象的强引用,这个对象就是不可达的,随时可能被回收;只能存储引用类型,不能枚举或清除它们。
2.WeakMap类似于Map,但是不可枚举,不能清空,是key引用对象的弱引用。
3.WeakSet适用于临时存储一组对象,也适用于存储绑定到对象的信息。只要这些对象在外部消失,它们在WeakSet中的引用就会自动消失。由于上述特征,WeakSet的成员不适合引用,因为它随时会消失。
4.强引用有时会忘记取消引用,导致无法释放内存,从而可能导致内存泄漏。但是,弱引用不包含在垃圾收集机制中,所以不存在这个问题。
【相关推荐:javascript视频教程,web前端】以上是一起分析JavaScript中弱引号和强引号的详细内容。更多请关注我们的其他相关文章!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。