WeakRef オブジェクトは、ターゲットオブジェクトへの弱い参照を作成することができます。ガベージコレクションの対象となるオブジェクトへの参照を保持しつつ、そのオブジェクトのガベージコレクションを妨げないようにするために使用されます[1]

構文

編集
new WeakRef(target)
  • target: 弱参照を作成する対象のオブジェクト。

メソッド

編集

WeakRef.prototype.deref()

編集
weakRef.deref()

弱参照のターゲットオブジェクトを返します。ターゲットオブジェクトがガベージコレクションによって回収された場合は undefined を返します。

基本的な WeakRef の使用方法

編集

以下のプログラムは、WeakRef を使用してオブジェクトへの弱い参照を作成する方法を示しています。

let obj = { data: "重要なデータ" };
const weakRef = new WeakRef(obj);

// WeakRef からオブジェクトを取得
console.log(weakRef.deref()); // { data: "重要なデータ" }

// 元のオブジェクトへの参照を解除
obj = null;

// この時点で、オブジェクトはガベージコレクションの対象となる可能性がある
// ガベージコレクションが実行されると、weakRef.deref() は undefined を返す

このプログラムでは、WeakRef を使用してオブジェクトへの弱い参照を作成しています。元のオブジェクトへの強い参照が無くなると、そのオブジェクトはガベージコレクションの対象となります。

FinalizationRegistry と組み合わせた使用例

編集

以下のプログラムは、WeakRefFinalizationRegistry を組み合わせて、オブジェクトがガベージコレクションされたときにクリーンアップ処理を行う方法を示しています。

const registry = new FinalizationRegistry((value) => {
  console.log(`${value} がガベージコレクションされました`);
});

let obj = { data: "一時的なデータ" };
const weakRef = new WeakRef(obj);

// オブジェクトを登録
registry.register(obj, "オブジェクト", weakRef);

// 元のオブジェクトへの参照を解除
obj = null;

// ガベージコレクションが実行されると、登録したコールバックが呼び出される

このプログラムでは、WeakRefFinalizationRegistry を使用して、オブジェクトがガベージコレクションされたときに通知を受け取っています。

注意点

編集
  • 非決定的: ガベージコレクションのタイミングは実装依存であり、予測できません。
  • 弱参照の目的: メモリリークを防止しつつ、オブジェクトが存在する場合にのみアクセスするために使用します。
  • キャッシュ: キャッシュや一時的なマッピングを実装する場合に有用です。
  • 使用制限: WeakRef のコンストラクタに非オブジェクト値を渡すと TypeError が発生します。

脚註

編集
  1. ^ WeakRefは、強い参照を作成せずにオブジェクトを参照するための機能です。

外部リンク

編集