ECMAScript 2021 引入 WeakRefs:追踪 JavaScript 中的弱引用对象

ECMAScript 2021 引入 WeakRefs:追踪 JavaScript 中的弱引用对象

在 JavaScript 中,每个对象都有一个引用计数,表示有多少个变量引用了这个对象。当引用计数为 0 时,垃圾回收机制便会回收这个对象的内存空间。然而,在某些情况下,我们需要在不影响引用计数的情况下跟踪某个对象是否还存在于内存中。这时候,就需要使用到 ECMAScript 2021 引入的 WeakRefs。

什么是 WeakRefs?

WeakRefs 是 ECMAScript 2021 引入的一种新类型,用于追踪 JavaScript 中的弱引用对象。所谓“弱引用对象”,指的是其引用计数为 0,但因为被一个引用所持有而不被垃圾回收机制收回的对象。WeakRefs 可以在不增加引用计数的情况下追踪这些弱引用对象是否还存在。

如何使用 WeakRefs?

弱引用对象的创建和使用可以通过 WeakRef 和 FinalizationRegistry 这两个 API 完成。

使用 WeakRef

创造 WeakRef 的方法是使用 WeakRef() 构造函数来初始化一个新的对象,可以通过调用其实例上的 deref() 方法来获取被追踪的对象引用:

const myObject = {};
const myObjectRef = new WeakRef(myObject);
const myDerefObject = myObjectRef.deref();
console.log(myDerefObject === myObject); // true

使用 FinalizationRegistry

FinalizationRegistry 是另一个用来进行垃圾回收追踪的 API。通过创建一个 FinalizationRegistry 对象,并使用其 register()方法来注册要监控的对象和一个可选的清理回调函数。当对象被垃圾回收时,清理回调函数将被自动调用。

const myObject = { name: 'Tom' };
const registry = new FinalizationRegistry(key => {
  console.log(`'${key.name}' has been cleared.`);
});
registry.register(myObject, { name: 'myObject' });
delete myObject; //清除对象

// 输出 'myObject has been cleared.'

在此例中,FinalizationRegistry 成功监视对象 myObject,并且当 myObject 被垃圾回收时,调用一个清理回调函数告诉我们发生了什么。

注意事项

使用 WeakRefs 有一些限制和注意事项:

  1. WeakRefs 只能用于原始类型和对象类型的引用,不能用于数组、对象属性或函数等。

  2. 即使使用 WeakRefs 进行追踪,JavaScript 引擎仍然有权随时回收任何未使用的对象,因此不能保证 WeakRefs 一定会有效。

  3. 在使用时,应谨慎处理处理清理回调函数,避免出现内存泄漏等问题。

总结

ECMAScript 2021 的弱引用和 WeakRefs 为我们提供了一种严格而安全的追踪 JavaScript 中的对象是否存在的方法。但是,应该注意到这种机制的局限性和注意事项,并在使用之前进行全面的测试和排查,以确保代码的正确性和可靠性。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/65a3a38fadd4f0e0ffbc6653


纠错反馈