FinalizationRegistry
// 当GC回收某块内存时的回调
const finalRegistry = new FinalizationRegistry((name) => {
console.log(name, '被GC回收了');
// 销毁之后deref获得的是undefined
console.log(obj4.deref()?.name);
});
let obj1 = { name: 'obj1' },
obj2 = { name: 'obj2' },
obj3 = obj1,
// WeakRef(弱引用)
obj4 = new WeakRef(obj2);
// deref会使弱引用变成强引用
// console.log(obj4.deref().name);
finalRegistry.register(obj1, 'obj1');
finalRegistry.register(obj2, 'obj2');
// obj1本质上是重新指向了null而{}依然被obj3强引用着所以obj1以对象字面量方式声明的对象在内存中并不会被回收
obj1 = null;
// 因为obj2现在重新指向了null而obj4使用了WeakRef是弱引用了对象字面量创建出的对象地址所以会被回收
obj2 = null;
// GC回收是不定时的且从下往上回收