WeakMapとは?
WeakMapは使用するキーと値のペアを保持するコレクション。
WeakMapのキーはオブジェクトである必要があり、プリミティブ値(文字列、数値など)は使用できません。
WeakMapのメリット
- メモリリークの防止
オブジェクトが他に参照されなくなったときに自動的にガベージコレクションされるので、不要なデータがメモリに残り続けることを防く事ができる。
Mapを使ったオブジェクトとWeakMapの違い
- Mapを使ったオブジェクト
Mapのキーとしてobjが使われるため、objはガベージコレクションされません。
let obj = { name: 'Alice' };
let map = new Map();
map.set(obj, 'Developer');
obj = null; // objはnullに設定されても、Mapが参照を保持し続けます
console.log(map); // 出力例Map(1) {{…} => 'Developer'} Mapはまだ値を保持しています
- WeakMapを使ったオブジェクト
WeakMap のキーとして格納されたobjが他に参照されなくなった場合、自動的にそのobjはガベージコレクションされます。
let obj = { name: 'Alice' };
let weakMap = new WeakMap();
weakMap.set(obj, 'Developer');
obj = null; // ガベージコレクションの対象にする
WeakMapを使ってみる
1. WeakMapの作成
WeakMap
のインスタンスを作成します。
const weakMap = new WeakMap();
2. オブジェクトをキーとしてデータを格納
obj
をキーとして値 "データ1" を格納しています。
const obj = {};
weakMap.set(obj, "データ1");
3. キーの存在確認
has メソッドで、指定したキーが WeakMap に存在するかどうかを確認します。
console.log(weakMap.has(obj)); // 出力例:true
4. データの取得
格納したデータは、get メソッドで取得できます。
さきほど格納したデータを取得します。
console.log(weakMap.get(obj)); // 出力例:データ1
5.データの削除
delete メソッドを使って、キーに対応するデータを削除できます。
weakMap.delete(obj);
console.log(weakMap.has(obj)); // 出力例:false
console.log(weakMap.get(obj)); // 出力例:undefined
WeakMapでキャッシュを作成する
// WeakMapを使ったシンプルなキャッシュ
const cache = new WeakMap();
function sampleComputation(obj) {
if (cache.has(obj)) {
console.log('キャッシュあり');
return cache.get(obj);
} else {
console.log('キャッシュなし');
const result = 'aaaaa';
cache.set(obj, result);
return result;
}
}
let obj1 = { key1: 'value111' };
console.log(sampleComputation(obj1)); // 出力例:キャッシュなし、aaaaa
console.log(sampleComputation(obj1)); // 出力例:キャッシュあり、aaaaa
// 値の参照を解除しガベージコレクションの対象にする
obj1 = null;
参考