在 ES12 中,WeakRefs 和 Finalizers 是两个新的特性,它们让 JavaScript 更加灵活和高效地处理内存管理。
WeakRefs 的使用
WeakRefs 是一种可回收的引用,当所引用的对象不再被引用时,WeakRefs 也就自动失效并被回收。与普通的引用不同,WeakRefs 不会阻止其所引用对象的垃圾回收。
如下是一段使用 WeakRefs 的示例代码:
const obj = { name: 'Jessie' }; const weakRef = new WeakRef(obj); if (weakRef.deref()) { console.log('obj is still alive'); } else { console.log('obj is garbage collected'); }
上述代码中,我们创建了一个对象 obj
,并将其传入了 WeakRef 构造函数中创建了一个 WeakRef 对象 weakRef
。在判断 weakRef
是否变成 null
的过程中,如果对象 obj
存在,则会输出结果 'obj is still alive'
。如果对象 obj
被垃圾回收器回收,weakRef.deref()
方法会返回 null
,代码输出结果为 'obj is garbage collected'
。
WeakRefs 与 Map 类似,它们都是以键值对的形式存储,可以使用 WeakMap 或 WeakSet 存储 WeakRefs。
const obj1 = { name: 'Jessie' }; const obj2 = { name: 'Ashley' }; const weakMap = new WeakMap([[obj1, 'Jessie'], [obj2, 'Ashley']]); console.log(weakMap.get(obj1)); // 'Jessie' obj1 = null; console.log(weakMap.get(obj1)); // undefined
在上面的代码中,我们创建了一个 WeakMap weakMap
,并将两个键值对([obj1
, 'Jessie'
],[obj2
, 'Ashley'
])作为 WeakRefs 存储在其中。当 obj1
指向 null
时,WeakMap 中保存的对应键值对就会失效。
Finalizers 的使用
Finalizers 提供了一种在对象被垃圾回收前执行指定操作的方式。在旧版 JavaScript 中,开发者并没有提供直接控制垃圾回收的方式,只能通过释放变量和手动移除事件监听等方式减少内存泄漏的问题。而使用 Finalizers,我们可以更好地预防和解决内存泄漏问题。
下面是一个使用 Finalizers 的示例代码:
const obj = { name: 'Jessie' }; new FinalizationRegistry((id) => { console.log(`object with id ${id} has been garbage collected`); }).register(obj, 'objId'); obj = null;
在上面代码中,我们使用 FinalizationRegistry 构造函数创建了一个实例,并在实例中注册了一个对象 obj
和对应的 objId
。在对象 obj
被垃圾回收前,对应的 console.log
方法会被调用输出信息,帮助开发者更好地预防和解决内存泄漏问题。
总结
WeakRefs 和 Finalizers 是 ES12 中新增的内存管理特性,使用它们可以更好地解决内存泄漏等问题。开发者可以灵活运用 WeakRefs 和 Finalizers,实现内存管理的高效优化。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/65b9f485add4f0e0ff28001e