Map.getOrInsert в ECMAScript 2026: новые методы для чистого production-кода
-

ECMAScript 2026 приносит Map.getOrInsert и Map.getOrInsertComputed - методы, которые радикально упрощают работу с Map в реальном коде. Забудьте про if (!map.has(key)) map.set(key, default). Теперь всё в одной строке, атомарно и без багов от race conditions.
Это решает типичные боли: группировка данных, кэширование, инициализация дефолтов. Код становится короче, читаемее, а производительность - выше. Особенно в production, где Map уже везде: от серверов на Node.js до фронтенда с React.
Что такое Map.getOrInsert и как он меняет игру
Метод Map.prototype.getOrInsert(key, defaultValue) проверяет, есть ли ключ в Map. Если да - возвращает значение. Нет - вставляет defaultValue и возвращает его. Всё атомарно, без промежуточных проверок. Это убивает классический паттерн с if и has/get/set, который плодит ошибки в многопотоке или асинхронке.
Представьте счётчик событий: раньше писали функцию с проверкой, теперь - чистая строка. Или группировка логов по типам - вместо четырёх строк одна. В production это экономит часы дебага и делает код самодокументируемым. Атомарность важна в SharedArrayBuffer или worker’ах, где параллельный доступ - норма.
Вот базовая логика:
- Проверяет наличие ключа
- Возвращает значение, если ключ есть
- Вставляет defaultValue и возвращает его, если нет
- Атомарно: никаких промежуточных состояний
Сценарий Старый код Новый код Инициализация дефолта if (!map.has(key)) map.set(key, []); map.get(key); map.getOrInsert(key, []); Счётчик let count = map.get(key) 0; map.set(key, count + 1); let count = map.getOrInsert(key, 0) + 1; map.set(key, count); Конфиг if (!prefs.has(‘theme’)) prefs.set(‘theme’, ‘light’); prefs.getOrInsert(‘theme’, ‘light’); Map.getOrInsertComputed: ленивые вычисления без лишнего
Map.prototype.getOrInsertComputed(key, fn) - брат-близнец, но с функцией вместо статичного значения. Callback fn вызывается только если ключа нет. Идеально для дорогих операций: fetch, вычисления, создание объектов. Не тратит ресурсы зря.
В кэше это магия: cache.getOrInsertComputed(key, () => computeHeavy(key)). Если ключ есть - fn не трогают. В production для API-клиентов или парсеров - спасение от дублирующих запросов. Ещё плюс: fn получает контекст, но в базовом случае просто возвращает значение.
Ключевые фичи:
- fn лениво: вызывается разок при первой вставке
- Атомарно, как и getOrInsert
- Поддержка WeakMap для GC-дружественного кэша
- Нюанс: fn не должна иметь сайд-эффекты, если Map чистится
Метод Аргументы Когда fn? Пример getOrInsert key, value Никогда map.getOrInsert(‘user’, {}); getOrInsertComputed key, () => value Только !has(key) map.getOrInsertComputed(‘user’, () => fetchUser(key)); Примеры в деле:
const cache = new Map(); const data = cache.getOrInsertComputed('api', () => fetch('/api/heavy').then(r => r.json())); // fn вызвана один раз, потом кэш хитаетПрактика в production: группировка, кэш, индексы
В реальном коде Map.getOrInsert сияет в обработке данных. Группировка по ключам - классика: из массива объектов строим Map<тип, массив>. Без него - if + push, с ним - чисто. Для логов, метрик, агрегации из стримов - огонь.
Кэш с ленивой init: index.getOrInsert(item.type, () => []).push(item). В сервере на Node.js это ускоряет роутинг или валидацию. Инвертированные индексы для поиска - тоже: wordToDocs.getOrInsert(word, () => []).push(docId). Масштабируется на миллионы записей без тормозов.
Типичные сценарии:
- Статистика: eventCounts.getOrInsert(eventName, 0) + 1;
- Графы: deps.getOrInsert(node, () => new Set()).add(dependent);
- Конфиги: prefs.getOrInsert(‘timeout’, 5000);
- Парсеры: parsed.getOrInsert(url, () => parseExpensive(url));
Задача Выгода getOrInsert Эффект в prod Группировка данных Одна строка вместо 4 -75% кода, меньше багов Ленивый кэш fn только раз Экономия CPU/API Метрики в реал-тайм Атомарно Без race conditions Другие новинки ECMAScript 2026 для Map
Помимо getOrInsert, в 2026 добавят Map.prototype.getOrUpdate и улучшения для WeakMap. getOrUpdate(key, updaterFn) - для атомарных обновлений: count.getOrUpdate(key, val => val + 1). Без блокировок, чисто JS.
WeakMap получит те же методы - для кэшей с GC. Плюс, интеграция с BigInt в JSON.parse для Map-сериализации. В production это упростит миграцию с lodash/groupBy или custom утилит на натив.
Что внутри:
- getOrUpdate: обновляет через fn, если ключ есть
- WeakMap-поддержка: auto-cleanup
- Совместимость: Chrome 145+, Node 24
Пример графа зависимостей:
const deps = new Map(); for (const pkg of packages) { deps.getOrInsert(pkg.name, () => []).push(pkg.version); }Эти методы - шаг к зрелому JS
Map.getOrInsert и компания закрывают gap между JS и языками вроде Rust или Go, где такие атомарки - стандарт. Код чище, production устойчивее, дебаг проще. Осталось дождаться фулл-поддержки в движках - но уже сейчас полифиллы на базе Proxy рулят.
Дальше думай над комбо с Records/Tuples из ES2025 или Float32Array для перф-критичных кэшей. Масштабируй на кластеры - и твой стек на годы вперёд.
Здравствуйте! Похоже, вас заинтересовала эта беседа, но у вас ещё нет аккаунта.
Надоело каждый раз пролистывать одни и те же посты? Зарегистрировав аккаунт, вы всегда будете возвращаться на ту же страницу, где были раньше, и сможете выбирать, получать ли уведомления о новых ответах (по электронной почте или в виде push-уведомлений). Вы также сможете сохранять закладки и ставить лайки постам, чтобы выразить свою благодарность другим участникам сообщества.
С вашими комментариями этот пост мог бы стать ещё лучше 💗
Зарегистрироваться Войти© 2024 - 2026 ExLends, Inc. Все права защищены.