【JSリファレンス】WeakMapコンストラクター
更新日:2024/06/14
WeakMapコンストラクターは、WeakMapオブジェクトを生成します。
WeakMapオブジェクトはキーと値の二つのフィールドを持つレコードのコレクションです。
同様の機能にMapコンストラクターがありますが、相違点はキーと実データとの関連付け方法です。
Mapは代入操作と同じ仕組みで関連付けられます。
一方のWeakMapは、弱い参照で関連付けられます。
■弱い参照
JavaScriptの仕組み上、変数やプロパティで参照されなくなった実データを再度参照することはできません。
そのようなデータは不要と判断され、ガーベッジコレクションが独自のタイミングでメモリ上から削除します。
このとき、弱い参照はガーベッジコレクションの判定対象となりません。
つまりWeakMapでデータを参照していても、実データが削除される可能性があります。
レコードの値フィールドは通常の参照ですが、キーが不要になったことを検知して、キーと対応する値フィールドと実データの関連付けが削除されます。
Mapには、自分で削除しない限りアルゴリズム上で必要が無いデータが永遠に残る(メモリリークしている)という問題がありました。
WeakMapは、この問題の対策の一つです。
ただしWeakMapには、キーと値の組を列挙する機能がありません。
いつ削除されるかわからないため、タイミングによって結果が変わるのを避けるためです。
■キーと値について
キーと値の関係はオブジェクトのプロパティ名と値の関係に似ていますが、プロパティ名で使用できる値が文字列、数値、シンボルの3種類に対し、キーはオブジェクトおよびシンボルの2種類です。
※Symbol.for()でグローバルシンボルレジストリに登録したシンボルは使用できません。
値は、全てのデータを使用できます。
■使い方
キー及び値のセットは、WeakMapオブジェクトの生成時、およびset()メソッドで行います。
const obj1 = {};
const sym1 = Symbol();
const wmapObj = new WeakMap([
[obj1,100],[sym1,200]
]);
// Symbol.for()で生成したシンボルはキーとして使用できない。
const sym2 = Symbol.for("symbolkey");
wmapObj.set( sym2 , "こんにちは" ); // TypeError
同じキーを複数所持することはできません。
同じキーをセットすると、値が上書きされます。
値の取得はget()メソッドで行います。
console.log( wmapObj.get( obj1 ) ); // 100
console.log( wmapObj.get( sym1 ) ); // 200
値の取得は変数またはプロパティに代入されたキーが必ず必要です。
そのような変数またはプロパティが存在しない場合、二度と値を取得できません。
■コンストラクター
■プロパティ
■メソッド
■prototypeプロパティ
■prototypeメソッド
関連ページ
更新日:2024/06/14
スポンサーリンク
記事の内容について
こんにちはけーちゃんです。
説明するのって難しいですね。
「なんか言ってることおかしくない?」
たぶん、こんなご意見あると思います。
裏付けを取りながら記事を作成していますが、僕の勘違いだったり、そもそも情報源の内容が間違えていたりで、正確でないことが多いと思います。
そんなときは、ご意見もらえたら嬉しいです。
掲載コードについては事前に動作確認をしていますが、貼り付け後に体裁を整えるなどをした結果動作しないものになっていることがあります。
生暖かい視線でスルーするか、ご指摘ください。
ご意見、ご指摘はこちら。
https://jsref.affi-sapo-sv.com/info.php
このサイトは、リンクフリーです。大歓迎です。