WeakRef
[TOC]
索引
构造方法:
- new WeakRef():
(targetObject)
,ES2021,允许创建不会阻止垃圾回收的对象弱引用。
方法:
- weakRef.deref():
()
,ES2021,用于访问弱引用指向的目标对象。
WeakRef
构造方法
new WeakRef()@
new WeakRef():(targetObject)
,ES2021,允许创建不会阻止垃圾回收的对象弱引用。
targetObject:
object
,要创建弱引用的目标对象。要求:必须是对象类型(不能是原始值)
可以是:普通对象、数组、函数、类实例、DOM元素等任意对象。
返回:
weakRef:
WeakRef
,返回一个 WeakRef 对象实例。
核心特性:
弱引用:不会阻止垃圾回收器回收该对象。
只能引用对象:参数不能是原始类型。
示例:
弱引用完整生命周期:
js// 阶段1:创建强引用 const target = { id: Date.now() }; // 阶段2:创建弱引用 const weakRef = new WeakRef(target); // 阶段3:访问对象(强引用存在) console.log(weakRef.deref().id); // 成功访问 // 阶段4:移除强引用 target = null; // 或离开作用域 // 阶段5:尝试访问(可能已回收) setTimeout(() => { const dereferenced = weakRef.deref(); if (dereferenced) { console.log("对象仍存在:", dereferenced.id); } else { console.log("对象已被回收"); } }, 5000);
合法使用场景:
js// 1. 普通对象 new WeakRef({ key: "value" }); // 2. 数组 new WeakRef([1, 2, 3]); // 3. 函数 new WeakRef(function() {}); // 4. 类实例 class MyClass {} new WeakRef(new MyClass()); // 5. DOM元素 new WeakRef(document.getElementById("myElement")); // 6. 内置对象 new WeakRef(new Map()); new WeakRef(new Set());
禁止使用场景:
js// 原始值(所有都会抛出 TypeError) new WeakRef(100); new WeakRef("text"); new WeakRef(true); new WeakRef(Symbol("id")); new WeakRef(null); new WeakRef(undefined); // 已回收对象(无效) const obj = {}; new WeakRef(obj); obj = null; // 创建时对象必须有效
方法
deref()@
weakRef.deref():()
,ES2021,用于访问弱引用指向的目标对象。
返回:
target:
object|undefined
,返回值:若目标对象未被回收返回该目标对象。
若目标对象已被回收或未设置,返回undefined。
示例:
基本使用:
jsconst obj = { id: 1 }; const weakRef = new WeakRef(obj); // 初始访问 console.log(weakRef.deref() === obj); // true // 移除强引用 obj = null; // 模拟垃圾回收后 globalThis.gc?.(); // Node.js 环境可用 // 再次访问 console.log(weakRef.deref()); // undefined(对象已被回收)