强引用的问题
在JS中,一般创建一个对象,都是建立一个强引用
var obj = new Object()
手动设置 obj = null 时,才有可能回收 obj 所引用的对象。
而创建弱引用对象,什么都不用做,只用等待垃圾回收机制执行,obj所引用的对象就会被回收。
在下面例子中:
const key = new Array(5 * 1024 * 1024);
const arr = [ [key, 1] ];
建立了 arr 对 key 所引用的对象(我们假设这个真正的对象叫 Obj)的强引用。所以当你设置 key = null 时,只是去掉了 key 对 obj 的强引用,并没有去掉 arr 对 obj 的强引用,所以obj还是不能被回收掉。
Map 类型类似:
let map = new Map();
let key = new Array(5 * 1024 * 1024);
// 建立了 map 对 key 所引用对象的强引用
map.set(key, 1);
// key = null 不会导致 key 的原引用对象被回收
key = null;
要想 obj 被回收,需要先 delete(key),然后再 key=null。
let map = new Map();
let key = new Array(5 * 1024 * 1024);
map.set(key, 1);
map.delete(key);
key = null;