js 强引用 弱引用
简介
在 JavaScript 中,强引用 和 弱引用 是两种不同的对象引用机制,它们直接影响垃圾回收(Garbage Collection)的行为。
强引用
- 定义:默认的引用类型。只要任意一个地方存在强引用指向某对象,垃圾回收器就不会回收该对象。
- 特点:
- 对象会被保留在内存中,直到所有强引用都断开(例如变量被置为 null,或超出作用域),才会被垃圾回收
- 常见的强引用包括变量、数组、对象属性、Map 中的键值对、Set 中的元素等
let obj = { data: "强引用对象" }; // obj 是强引用
const map = new Map();
map.set(obj, "关联数据"); // Map 中的键也是强引用
obj = null; // 断开 obj 的强引用,但 Map 中仍保留对原对象的强引用!
// 原对象不会被回收,因为 Map 仍然引用它
弱引用
- 定义:一种不阻止垃圾回收的引用。如果对象只有弱引用指向它,垃圾回收器可以回收该对象。
- 特点:
- 弱引用不会阻止对象的回收,适合用于临时或可丢弃的数据。
- 弱引用必须通过特定数据结构实现:WeakMap、WeakSet(ES6+)或 WeakRef(ES2021+)。
- 不可枚举:无法遍历弱引用集合(如 WeakMap 没有 keys() 或 values() 方法)。
- 键必须是对象:WeakMap 的键和 WeakSet 的元素必须是对象(原始类型如 string、number 无效)。
let user = { name: "Alice" };
const weakMap = new WeakMap();
weakMap.set(user, "敏感数据"); // weakMap 的键是若引用
user = null; // 断开强引用
// 垃圾回收后,weakMap 中对应的条目会自动删除
⚠️ 使用注意
- 弱引用无法保证对象长期存在,因此使用 WeakMap 或 WeakRef 时,始终要检查对象是否存在(例如 weakRef.deref())。
- 过度依赖弱引用可能导致代码难以调试(因为对象可能突然“消失”)。