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