WeakMap は、キーがオブジェクトであり、値が任意の値であるキーと値のペアのコレクションです。通常の Map とは異なり、WeakMap のキーは「弱参照」されます。これは、キー オブジェクトへの参照が他にない場合、そのオブジェクトをガベージ コレクションできることを意味し、メモリ リークの防止に役立ちます。
1. メモリ管理: 未使用のキーのガベージ コレクションを許可することで、効率的なメモリ使用を支援します。
2. プライベート データ: オブジェクト キーを持っていないとデータにアクセスできないため、オブジェクトのプライベート データを保存するために使用できます。
3. メモリ リークの回避: DOM 操作のような、DOM 要素が DOM から削除されるときにガベージ コレクションを妨げずに DOM 要素のメタデータを保存したい場合に特に役立ちます。
WeakMap は WeakMap コンストラクターを使用して作成されます。使用方法は次のとおりです:
let weakMap = new WeakMap();
let obj = {}; weakMap.set(obj, 'value associated with obj');
console.log(weakMap.get(obj)); // 'value associated with obj'
console.log(weakMap.has(obj)); // true
weakMap.delete(obj); console.log(weakMap.has(obj)); // false
WeakMap を使用して、現在秘密の隠れ家にいるスーパーヒーローを追跡しましょう。秘密の隠れ家には、スーパーヒーローが中にいる限り、彼らに関する情報のみが保管されます。彼らが離れると、隠れ家はメモリの過負荷を避けるために彼らのことを忘れます。
例: スーパーヒーローの隠れ家
let secretHideout = new WeakMap(); function Superhero(name) { this.name = name; } // Superheroes enter the hideout let batman = new Superhero('Batman'); let superman = new Superhero('Superman'); secretHideout.set(batman, 'Batcave'); secretHideout.set(superman, 'Fortress of Solitude'); console.log(secretHideout.get(batman)); // 'Batcave' console.log(secretHideout.get(superman)); // 'Fortress of Solitude' // Batman leaves the hideout batman = null; // No more references to Batman // After garbage collection, the hideout forgets about Batman setTimeout(() => { console.log(secretHideout.get(batman)); // undefined (Batman has been garbage collected) console.log(secretHideout.has(superman)); // true (Superman is still in the hideout) }, 1000);
この例では:
あまりにも秘密すぎて、すぐに戻らないと誰が中にいたのかさえ忘れてしまう秘密の隠れ家を想像してみてください。この例のように、WeakMap はバットマンがいなくなるとバットマンのことを忘れ、隠れ家の記憶をクリーンかつ効率的に保ちます。
キーはオブジェクトである必要があります: WeakMap ではオブジェクトのみをキーとして使用できます。
反復可能ではありません: WeakMap は反復可能ではないため、for-of のようなループでは使用できません。
ガベージ コレクション: 主な利点は、ガベージ コレクターがプログラム内の他の場所で参照されなくなったキーをクリーンアップして、メモリ リークを防止できることです。
これにより、WeakMap は、オブジェクトを不必要に存続させることを心配せずに、オブジェクトに関連する一時データを保存する必要がある場合に特に役立ちます。
以上がJavaScript の WeakMap とは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。