前言:
在看ES6 WeakMap和WeakSet知识点的时候,看到了“弱引用”三个字,很陌生。
在JavaScript中,一般都是强引用,弱引用对象的唯一方法就是ES6的WeakMap和WeakSet。
先简单阐述”垃圾回收“:
垃圾回收: 在创建变量、函数、对象等时,自动分配内存,在使用完(不使用)时,自动释放内存的过程。
强引用
将一个引用类型数据通过变量/常量保存,这个变量/常量就是强引用。
特点: 不会被垃圾回收器回收,可能导致内存无法释放,造成内存泄漏。
将全部引用该对象的变量关系都设置为null,这个对象就会被垃圾回收器回收。
var obj = { x: 1, y: 2 };
// 只要访问obj对象(或者任何其他引用指向该对象),这个对象就不会被垃圾回收。
obj = null;
// obj设为null,obj就会被被垃圾回收器回收。
弱引用
没有通过变量/常量和引用地址进行联系,有着更短暂的生命周期。
特点: 会时刻被垃圾回收器回收,不会导致内存泄漏
方法: WeakMap和WeakSet
let wm = new WeakMap();
let wobj = { x : 1 };
wm.set( wobj, '2' );
wobj = null;
// 说明:wobj为null后,键不存在,即为弱引用,{ x : 1 } 会被垃圾回收器回收
注意: WeakMap,是一组键值对的集合,键必须是对象,键存在,就是强引用,键不存在,就是弱引用。(不是真正意义上的弱引用)
网上有一个很经典的例子
强引用:小孩A牵着一条狗,他们之间通过狗链连着
弱引用就是,小孩B指着A牵的狗,说:嘿,那有条狗,B指向那条狗,但他们之间没有是绑在一起的东西
当A放开狗链,无论B是不是还指着,狗都会跑掉(被垃圾回收器回收),
当B不再指着那条狗,狗还被A牵着,不会影响它是否跑掉
结论
强引用会屏蔽垃圾回收,弱引用不会屏蔽垃圾回收
结尾:好记性不如烂笔头,写点笔记,督促进步。撒花 🎉🎉🎉