ECMAScript 2020(ES11)的新特性:WeakRefs 与 Finalizers

阅读时长 4 分钟读完

ECMAScript(简称为 ES)是一种由 Ecma 国际组织标准化的脚本语言,常用于 Web 开发中的前端页面。ES2020(简称 ES11)是最新版本的 ECMAScript 标准,于 2020 年 6 月发布。本文将介绍 ES11 中的一项新特性:WeakRefs 和 Finalizers。

WeakRefs 与 Finalizers 的作用

WeakRefs 和 Finalizers 是两个 JavaScript 的垃圾回收(Garbage Collection)相关功能,用于更好地管理 JavaScript 内存的生命周期。

在 JavaScript 中,当一个对象不再被需要时,垃圾回收机制会自动回收其占用的内存空间。但是,有时候我们需要在内存中保留某些对象,比如缓存对象或事件监听器,但是又不想完全阻止它们被垃圾回收机制清理。这时候就可以用到 WeakRefs 和 Finalizers。

WeakRefs(弱引用)是一种对象引用,它不会阻止垃圾回收机制将其所引用的对象清除掉。而 Finalizers(终结器)则是一种回调函数,它会在垃圾回收器清理对象之前调用,可以用来释放关联的资源。

这两个功能的联合使用可以更好地在 JavaScript 中管理内存,避免内存泄漏和提高代码效率。

WeakRefs 的语法

使用 WeakRefs 可以创建一个弱引用对象,如下所示:

在上面的代码中,obj 是一个普通的 JavaScript 对象,weakRef 是一个弱引用对象。

我们可以通过 WeakRef 对象的 deref() 方法,检查它所引用的对象是否还存在:

当它引用的对象被垃圾回收机制回收掉时,deref() 方法会返回 null

Finalizers 的语法

使用 Finalizers 可以创建一个回调函数,用于在对象被垃圾回收清理前释放相关资源。下面是一个使用 Finalizers 的示例代码:

-- -------------------- ---- -------
----- ----- -
  ------------- -
    -------------- - --- ---------------------------------
    -------------- - --- ------------------------ -- -
      ---------------------
    ---
    ----------------------------- ---------
  -
-

--- --- - --- --------
--- - ----- -- ------

上面的代码中,MyObj 是一个自定义类,它会创建一个占用大量内存资源的 resources 数组,并且在构造函数中使用 Finalizers 注册一个回调函数,以便在对象被回收前释放资源。在最后一行代码中,我们将 obj 赋值为 null,触发垃圾回收机制。

obj 对象被垃圾回收器清理时,Finalizers 注册的回调函数会被调用,从而释放 resources 数组占用的内存。

总结

WeakRefs 和 Finalizers 是 ES11 中新增的两个垃圾回收相关功能,用于更好地管理内存资源。使用它们可以避免内存泄漏,提高代码效率。我们在开发过程中应该根据具体情况选择是否使用 WeakRefs 和 Finalizers。

在使用 WeakRefs 和 Finalizers 时,需要注意以下几点:

  • 不要将 WeakRefs 和 Finalizers 用于所有对象,只使用于确实需要减少内存耗用的对象。
  • 记得在程序中的适当时间中调用垃圾回收机制的方法,如 globalThis.gc()
  • 尽可能避免使用 Finalizers 的软删除(Soft Deletion)模式,这可能会导致对象被保留在内存中更长时间,导致内存占用增加。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6656c069d3423812e4bb2f93

纠错
反馈