Skip to content

WeakRef

[TOC]

索引

构造方法

  • new WeakRef()(targetObject)ES2021,允许创建不会阻止垃圾回收的对象弱引用

方法

  • weakRef.deref()()ES2021,用于访问弱引用指向的目标对象

WeakRef

构造方法

new WeakRef()@

new WeakRef()(targetObject)ES2021,允许创建不会阻止垃圾回收的对象弱引用

  • targetObjectobject,要创建弱引用的目标对象。要求:

    • 必须是对象类型(不能是原始值)

    • 可以是:普通对象、数组、函数、类实例、DOM元素等任意对象。

  • 返回:

  • weakRefWeakRef,返回一个 WeakRef 对象实例。

核心特性

  1. 弱引用:不会阻止垃圾回收器回收该对象。

  2. 只能引用对象:参数不能是原始类型。

示例

  1. 弱引用完整生命周期

    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);
  2. 合法使用场景

    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());
  3. 禁止使用场景

    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,用于访问弱引用指向的目标对象

  • 返回:

  • targetobject|undefined,返回值:

    • 若目标对象未被回收返回该目标对象。

    • 若目标对象已被回收或未设置,返回undefined。

示例

  1. 基本使用

    js
    const 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(对象已被回收)