JavaScript 强引用和弱引用

976 阅读2分钟

前言:

在看ES6 WeakMap和WeakSet知识点的时候,看到了“弱引用”三个字,很陌生。

在JavaScript中,一般都是强引用,弱引用对象的唯一方法就是ES6的WeakMapWeakSet

先简单阐述”垃圾回收“:

垃圾回收: 在创建变量、函数、对象等时,自动分配内存,在使用完(不使用)时,自动释放内存的过程。

强引用

将一个引用类型数据通过变量/常量保存,这个变量/常量就是强引用。

特点: 不会被垃圾回收器回收,可能导致内存无法释放,造成内存泄漏。

将全部引用该对象的变量关系都设置为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牵着,不会影响它是否跑掉

结论

强引用会屏蔽垃圾回收,弱引用不会屏蔽垃圾回收

结尾:好记性不如烂笔头,写点笔记,督促进步。撒花 🎉🎉🎉