Chrome 145: Map.getOrInsert для атомарных операций в коллекциях
-
В Chrome 145 появилась поддержка метода Map.getOrInsert(). Это упрощает работу с коллекциями Map, где нужно быстро получать значение по ключу или вставлять значение по умолчанию, если ключа нет. Такой подход решает проблему race conditions в многопоточных сценариях и делает код чище.
Метод полезен для кэшей, настроек пользователя или агрегации данных. Вместо проверок has() и set() вы пишете одну строку. Это экономит время и снижает ошибки в JavaScript-приложениях, особенно на фронтенде.
Как работает Map.getOrInsert()
Метод Map.getOrInsert(key, defaultValue) возвращает значение по ключу, если оно есть, или вставляет и возвращает defaultValue. Это атомарная операция - нет промежуточных состояний, где Map может измениться другим потоком. Представьте кэш запросов: если ключ отсутствует, метод сам создаст пустой объект или массив.
Пример: const map = new Map(); const value = map.getOrInsert(‘user’, {}); Теперь value - это объект, готовый к использованию. Без метода пришлось бы писать if (!map.has(‘user’)) map.set(‘user’, {}); return map.get(‘user’); Это на две строки больше и менее надежно.
Раньше разработчики использовали паттерн map.get(key) ?? defaultValue, но он ненадежен, если null или undefined - валидные значения. getOrInsert решает это четко.
- Атомарность: Метод гарантирует, что проверка и вставка происходят без прерываний.
- Производительность: Избегает двойного обращения к Map (has + get/set).
- Читаемость: Одна строка вместо трех - код становится короче и понятнее.
Сравнение подходов Старый способ Map.getOrInsert() Код if (!map.has(key)) map.set(key, def); return map.get(key); map.getOrInsert(key, def) Строки 3 1 Атомарность Нет Да Обработка null Проблемы Без проблем Map.getOrInsertComputed() для сложных случаев
Этот метод похож, но вместо фиксированного defaultValue принимает функцию. Функция вызывается только если ключа нет. Идеально, когда создание значения дорогое - например, вычисление или запрос к API.
Синтаксис: map.getOrInsertComputed(key, () => expensiveComputation()). Если ключ есть, функция не запустится. Это как lazy initialization в других языках. Пример с массивом: map.getOrInsertComputed(‘logs’, () => []); Теперь можно сразу push без проверок.
В реальных проектах это полезно для кэша вычислений. Допустим, вы агрегируете статистику пользователей - функция посчитает сумму только при первом обращении.
- Ленивые вычисления: Функция выполняется только по необходимости.
- Аналог в WeakMap: WeakMap.getOrInsertComputed работает так же для слабых ссылок.
- Нюанс: Функция должна быть чистой - без сайд-эффектов, иначе поведение непредсказуемо.
Таблица преимуществ:
Сценарий getOrInsert getOrInsertComputed Простой default 
(но избыточно)Дорогое значение 

Массивы/объекты
map.getOrInsert(key, [])
С функциейWeakMap 

Поддержка в браузерах и полифиллы
Chrome 145 первым добавил getOrInsert для Map и WeakMap. Firefox с версии 144, Safari с 26.2. Edge пока отстает - до 143 не поддерживает. Для Android Chrome поддержка с 145.
Проверить можно на caniuse.com: полная поддержка в новых версиях, но для старых IE/Edge нужен полифилл. Простой полифилл: Map.prototype.getOrInsert = function(key, def) { if (!this.has(key)) this.set(key, def); return this.get(key); };
Это не атомарно, но лучше, чем ничего. В production проверяйте feature detection: if (‘getOrInsert’ in Map.prototype).
- Chrome: 145+

- Firefox: 144+

- Safari: 26.2+

- Edge: Пока
, ждем обновлений
Важно: В WeakMap методы работают аналогично, но ключи - только объекты.
Практика: примеры в коде
Давайте разберем реальные кейсы. Первый - кэш пользовательских предпочтений: const prefs = new Map(); prefs.getOrInsert(‘theme’, ‘light’); Теперь prefs.get(‘theme’) всегда вернет строку.
Второй - счетчики событий: const counters = new Map(); function increment(key) { counters.getOrInsertComputed(key, () => 0)++; } Атомарно увеличивает счетчик.
Третий - группировка данных: const groups = new Map(); groups.getOrInsert(key, []).push(item); Массив всегда существует.
const cache = new Map(); // Настройки function getOrSetTheme(key) { return cache.getOrInsert(key, 'light'); } // Статистика function countEvent(event) { const count = cache.getOrInsertComputed(event, () => 0); cache.set(event, count + 1); return count + 1; }Новые возможности на горизонте
Методы getOrInsert открывают дверь для более эффективного кода в Chrome 145. Осталось внедрить их в библиотеки вроде Shaka Player, где уже обсуждают миграцию. Подумайте о WeakMap для временных данных - там утечки памяти под контролем.
Дальше ждем полной кросс-браузерной поддержки и интеграции в фреймворки. Это шаг к JavaScript без boilerplate для коллекций.
Здравствуйте! Похоже, вас заинтересовала эта беседа, но у вас ещё нет аккаунта.
Надоело каждый раз пролистывать одни и те же посты? Зарегистрировав аккаунт, вы всегда будете возвращаться на ту же страницу, где были раньше, и сможете выбирать, получать ли уведомления о новых ответах (по электронной почте или в виде push-уведомлений). Вы также сможете сохранять закладки и ставить лайки постам, чтобы выразить свою благодарность другим участникам сообщества.
С вашими комментариями этот пост мог бы стать ещё лучше 💗
Зарегистрироваться Войти© 2024 - 2026 ExLends, Inc. Все права защищены.