FinalizationRegistry & WeakRefs - 2022-10-24

FinalizationRegistry

一般来说,在JavaScript中,对象的引用是强引用的,这意味着只要持有对象的引用,它就不会被垃圾回收。只有当该对象没有任何的强引用时, js引擎垃圾回收器才会销毁该对象并且回收该对象所占的内存空间。

let obj = { a: 1 } //只要存在访问obj, 对象就不会被回收

使用FinalizationRegistry对象可以在垃圾回收器回收对象时执行回调函数

// 构建监听对象被垃圾回收器清除的回调
const registry = new FinalizationRegistry(heldValue => {
  if (val === "obj") {
    console.log("obj对象被销毁");
  }
  if (val === "token") {
    console.log("token对象被销毁");
  }
});

const obj = {};
const token = {};

// 注册监听
/********
 * register 参数分别为:
 * obj1: 需要监听的对象
 * func: 执行回调函数的参数
 * obj2: 取消监听用的标识符
 * */
registry.register(obj, "obj deleted!", token);

// 取消监听
registry.unregister(token);

obj = null // obj对象被销毁

WeakRefs

WeakRef对象允许创建对另一个对象的弱引用,对象的弱引用是指当该对象应该被 js引擎垃圾回收器回收时不会阻止垃圾回收器的回收行为。
Weakref 实例具有一个方法 deref,该方法返回被引用的原始对象,如果原始对象已被收集,则返回 undefined 对象。

const ref = new WeakRef({ name: 'aaa' });
let obj = ref.deref();
if (obj) {
  console.log(obj.name); // aaa
} 
let o = {
  name: "aaa",
};
const foo = new WeakRef(o);

console.log(foo.deref()); // aaa

setTimeout(() => {
  console.log(foo.deref()); // undefined
}, 10000);

obj = null;

你可能感兴趣的:(FinalizationRegistry & WeakRefs - 2022-10-24)