WeakMap.prototype.getOrInsertComputed()
Базовый уровень Новое
Эта функция работает на последних устройствах и версиях браузеров. Эта функция может не работать на старых устройствах или версиях браузеров. Она доступна во всех браузерах с февраля 2026 года.
Метод getOrInsertComputed() экземпляров WeakMap возвращает значение, соответствующее указанному ключу в этом WeakMap. Если ключ отсутствует, он вставляет новую запись с ключом и значением по умолчанию, вычисляемым из предоставленного обратного вызова, и возвращает вставленное значение.
Используйте этот метод вместо WeakMap.prototype.getOrInsert(), когда значение по умолчанию дорого вычислять, и вы хотите избежать его вычисления, если оно не требуется на самом деле.
Попробуйте
const alan = { name: "Alan" };
const map = new WeakMap([[alan, 35]]);
const defaultCreator = (obj) => `${obj.name}'s age is unknown`;
console.log(map.getOrInsertComputed(alan, defaultCreator));
// Expected output: 35
const brett = { name: "Brett" };
console.log(map.getOrInsertComputed(brett, defaultCreator));
// Expected output: "Brett's age is unknown"
Синтаксис
getOrInsertComputed(key, callback)
Параметры
-
key - Ключ элемента, который нужно вернуть из объекта
Map. Должен быть либо объектом, либо незарегистрированным символом. Ключи объектов сравниваются по ссылке, а не по значению. -
callback - Функция, которая возвращает значение для вставки и возврата, если ключ еще не присутствует в объекте
Map. Функция вызывается со следующим аргументом:-
key - Тот же ключ, что был передан в
getOrInsertComputed().
-
Возвращаемое значение
Значение, связанное с указанным ключом в объекте WeakMap. Если ключ не найден, результат callback(key) вставляется и возвращается.
Исключения
-
TypeError - Выбрасывается в одном из следующих случаев:
-
keyне является объектом или незарегистрированным символом. -
callbackне вызываема.
-
Примеры
Кэширование
Кэширование включает построение сопоставления параметров дорогостоящей функции с её возвращаемым значением, чтобы будущие вызовы с теми же параметрами могли вернуть кэшированное значение вместо перевычисления. Когда кэшированное значение отсутствует, оно должно быть вычислено и вставлено в кэш.
Мы используем WeakMap здесь вместо Map, чтобы значения аргументов кэша не препятствовали их сборке мусора, если они больше не нужны в других частях программы. Если ваша кэширующая функция принимает не-объектные аргументы, вы можете использовать Map вместо этого.
// Any expensive function you want to cache
function computeExpensiveValue(requestOptions) {
// Imagine expensive computation, like fetching data or complex calculations
console.log(`Fetching from ${requestOptions.url}`);
return new Response("Fake response");
}
// A higher-order function that adds caching to any function
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); // Logs "Fetching from https://example.com/a"
const value2 = computeWithCache(options); // No log
Спецификации
Совместимость с браузерами
| Десктоп | Мобильные | Сервер | |||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Chrome | Edge | Firefox | Opera | Safari | Chrome Android | Firefox for Android | Opera Android | Safari on iOS | Samsung Internet | WebView Android | WebView on iOS | Bun | Deno | Node.js | |
getOrInsertComputed |
145 |
145 |
144 |
129 |
26.2 |
145 |
144 |
96 |
26.2 |
Нет |
145 |
26.2 |
1.2.20 |
2.6.7 |
26.0.0 |
См. также
- Polyfill of
WeakMap.prototype.getOrInsertComputedincore-js - es-shims polyfill of
WeakMap.prototype.getOrInsertComputed WeakMapWeakMap.prototype.get()WeakMap.prototype.set()WeakMap.prototype.has()WeakMap.prototype.getOrInsert()
© 2005–2025 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WeakMap/getOrInsertComputed