コンテンツにスキップ

JavaScript/WeakRef

出典: フリー教科書『ウィキブックス(Wikibooks)』

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

構文

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

メソッド

[編集]

WeakRef.prototype.deref()

[編集]
weakRef.deref()

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

[編集]

基本的な WeakRef の使用方法

[編集]

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

letobj={data:"重要なデータ"};constweakRef=newWeakRef(obj);// WeakRef からオブジェクトを取得console.log(weakRef.deref());// { data: "重要なデータ" }// 元のオブジェクトへの参照を解除obj=null;// この時点で、オブジェクトはガベージコレクションの対象となる可能性がある// ガベージコレクションが実行されると、weakRef.deref() は undefined を返す

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

FinalizationRegistry と組み合わせた使用例

[編集]

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

constregistry=newFinalizationRegistry((value)=>{console.log(`${value} がガベージコレクションされました`);});letobj={data:"一時的なデータ"};constweakRef=newWeakRef(obj);// オブジェクトを登録registry.register(obj,"オブジェクト",weakRef);// 元のオブジェクトへの参照を解除obj=null;// ガベージコレクションが実行されると、登録したコールバックが呼び出される

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

注意点

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

脚註

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

外部リンク

[編集]
close