1
1

WeakMapを使用しキャッシュを作成する

Posted at

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;

参考

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1