随着前端技术的不断发展,JavaScript 也在不断更新,ES9 引入了 WeakRef 和 FinalizationRegistry 两个重要的 API,这两个 API 对于前端程序员来说具有重要的意义。本文将详细介绍它们的作用、使用方法和示例代码。
WeakRef
WeakRef 是 ES9 中引入的新类型,它用于表示对一个对象的弱引用。与普通引用不同,当一个对象被弱引用时,它不会阻止垃圾回收器回收它。也就是说,如果一个对象只被一个弱引用所持有,则该对象可能会被回收。
在 JavaScript 中,我们经常需要绑定事件、添加计时器等操作,这些操作都会创建一个闭包,使得被绑定的元素或计时器无法被垃圾回收。而使用 WeakRef 可以避免这种情况,从而提高内存使用效率。
WeakRef 的 API 有两个方法:
deref()
:用于获取被弱引用的对象,如果该对象已经被回收,则返回undefined
。constructor(target: T)
:创建一个对目标对象target
的弱引用。
以下是示例代码:
// javascriptcn.com 代码示例 // 创建一个对象的弱引用 const obj = { foo: 'bar' } const objRef = new WeakRef(obj) // 获取被弱引用的对象 const target = objRef.deref() console.log(target) // { foo: 'bar' } // 删除原对象引用后再获取 obj = null console.log(objRef.deref()) // undefined
FinalizationRegistry
FinalizationRegistry 是 ES9 中引入的新类型,它用于在垃圾回收对象时执行指定的回调函数。与 WeakRef 不同,FinalizationRegistry 处理的是被垃圾回收的对象,并执行相应的回调函数。
FinalizationRegistry 的 API 有三个方法:
constructor(cleanupCallback: (target: T) => void)
:创建一个 FinalizationRegistry,指定回调函数cleanupCallback
,它会在对象被回收时执行。register(target: T, heldValue: any, unregisterToken?: object): void
:将对象target
注册到 FinalizationRegistry 中,并指定额外传递给回调函数的参数heldValue
,同时返回一个unregisterToken
。unregister(unregisterToken: object): void
:删除注册时返回的unregisterToken
。
以下是示例代码:
// javascriptcn.com 代码示例 // 创建一个 FinalizationRegistry const registry = new FinalizationRegistry(target => { console.log(`object with id ${target.id} has been garbage collected`) }) // 注册一个对象到 FinalizationRegistry 中 const object = { id: 1 } registry.register(object, 'extra info') // 删除原对象引用后再观察控制台输出 object = null
在上述代码中,当对象 object
被垃圾回收时,该对象的 ID 会被打印出来。
总结
WeakRef 和 FinalizationRegistry 是 ES9 中新增的两个 API,它们可以更好地处理内存回收问题,提高代码效率和性能。在写 JavaScript 代码时,应该尽可能使用它们来避免造成内存泄漏等问题。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/653f7c637d4982a6eb90dc0e