Spec-Zone.ru › JavaScript

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

Спецификации

Спецификация
Спецификация языка ECMAScript® 2027
# sec-weakmap.prototype.getorinsertcomputed

Совместимость с браузерами

Десктоп Мобильные Сервер
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.getOrInsertComputed in core-js
  • es-shims polyfill of WeakMap.prototype.getOrInsertComputed
  • WeakMap
  • WeakMap.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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API