このページはコミュニティーの尽力で英語から翻訳されました。MDN Web Docs コミュニティーについてもっと知り、仲間になるにはこちらから。

View in English Always switch to English

WeakMap.prototype.getOrInsertComputed()

Limited availability

This feature is not Baseline because it does not work in some of the most widely-used browsers.

getOrInsertComputed()WeakMap インスタンスのメソッドで、この WeakMap 内で指定されたキーに対応する値を返します。キーが存在しない場合、指定されたコールバックから計算されたデフォルト値と共にキーを持つ新しい項目を挿入し、挿入された値を返します。

デフォルト値の計算コストが高い場合、実際に必要でない限り計算を避けることができるときは、WeakMap.prototype.getOrInsert() の代わりにこのメソッドを使用してください。

試してみましょう

const alan = { name: "Alan" };
const map = new WeakMap([[alan, 35]]);
const defaultCreator = (obj) => `${obj.name} の年齢は不明です`;

console.log(map.getOrInsertComputed(alan, defaultCreator));
// 予想される結果: 35

const brett = { name: "Brett" };
console.log(map.getOrInsertComputed(brett, defaultCreator));
// 予想される結果: "Brett の年齢は不明です"

構文

js
getOrInsertComputed(key, callback)

引数

key

WeakMap オブジェクトから値を取得する項目のキー。オブジェクトまたは非登録シンボルのどちらかでなければなりません。オブジェクトのキーは値ではなく参照として比較されます。

callback

Map オブジェクトにキーが存在しない場合に挿入して返す値を返す関数。この関数は次の引数で呼び出されます。

key

getOrInsertComputed() に渡されたものと同じキー。

返値

この WeakMap オブジェクト内の指定されたキーに関連付けられた値です。キーが見つからなかった場合は、callback(key) の結果が追加され返されます。

例外

TypeError

key がオブジェクトでも非登録シンボルでもない場合、または callback が呼び出し可能でない場合に発生します。

キャッシュ

キャッシュとは、計算コストの高い関数の引数とその返値の対応関係を構築する処理です。これにより、同じ引数で呼び出された場合、再計算せずにキャッシュされた値を返すことができます。キャッシュ値が存在しない場合は、計算してキャッシュに挿入する必要があります。

ここでは Map ではなく WeakMap を使用しています。これにより、キャッシュされた引数値がプログラム内の他の場所で不要になった場合でも、ガベージコレクションを妨げることがありません。キャッシュする関数がオブジェクト以外の引数を取る場合は、代わりに Map を使用することができます。

js
// キャッシュしたい高負荷な関数
function computeExpensiveValue(requestOptions) {
  // データ取得や複雑な計算といった高コストな処理を想像してください
  console.log(`${requestOptions.url} より取得`);
  return new Response("偽のレスポンス");
}

// 任意の関数にキャッシュ機能を追加する高階関数
function withCache(fn) {
  const cache = new WeakMap();
  return (param) => cache.getOrInsertComputed(param, fn);
}

const computeWithCache = withCache(computeExpensiveValue);
const options = { url: "https://example.com/a", method: "GET" };
const value1 = computeWithCache(options); // ログ出力 "https://example.com/a より取得"
const value2 = computeWithCache(options); // ログ出力なし

仕様書

Specification
Upsert
# sec-weakmap.prototype.getOrInsertComputed

ブラウザーの互換性

関連情報