贝利信息

JavaScript弱引用_WeakMap与WeakSet使用

日期:2025-11-26 00:00 / 作者:夜晨
WeakMap和WeakSet通过弱引用实现对象的私有数据存储与状态标记,键或值仅限对象且不阻止垃圾回收,适用于缓存、避免内存泄漏等场景。

JavaScript中的弱引用机制主要通过WeakMapWeakSet实现。它们与普通的Map和Set不同,持有的对象引用是“弱”的,不会阻止垃圾回收器回收这些对象。这在处理大量对象或需要避免内存泄漏的场景中非常有用。

WeakMap:键必须是对象的弱引用集合

WeakMap 的键只能是对象(包括函数、数组等),且这些键是弱引用的。当一个对象不再被其他变量引用时,它在 WeakMap 中对应的条目会自动被清除。

常见用途:

示例:

const privateData = new WeakMap();

class Person { constructor(name) { this.name = name; privateData.set(this, { createdAt: Date.now() }); }

getAge() { return Date.now() - privateData.get(this).createdAt; } }

当Person实例被销毁,privateData中对应的数据也会被自动清理。

WeakSet:对象的弱引用集合

WeakSet 只能存储对象,且这些对象是弱引用。它不提供遍历方法,也无法获取当前包含多少对象,只能通过add、delete、has操作。

适用场景:

示例:

const inProgress = new WeakSet();

function animate(element) { if (inProgress.has(element)) return; inProgress.add(element);

// 执行动画 element.animate(...);

element.onanimationend = () => { inProgress.delete(element); }; }

即使忘记调用delete,element被移除后也不会因WeakSet引用而残留。

WeakMap 和 WeakSet 的限制与特点

由于弱引用的特性,它们有一些使用上的限制:

这些设计是为了保证不干扰垃圾回收过程。

基本上就这些。WeakMap和WeakSet适合用于辅助性数据结构,尤其是你不想影响对象生命周期的场合。用好了能有效减少内存占用,避免隐性内存泄漏。