Map.getOrInsert в ECMAScript 2026: атомарные операции для Map в Chrome 145
-
В ECMAScript 2026 появились методы Map.getOrInsert и Map.getOrInsertComputed. Они упрощают работу с Map, позволяя атомарно получать значение по ключу или вставлять новое, если ключа нет. Это решает проблему шаблонных проверок has/get/set, которые часто приводят к race conditions в многопоточных сценариях или асинхронном коде.
Теперь не нужно писать if (map.has(key)) { return map.get(key); } else { map.set(key, value); return value; }. Один вызов метода делает всё сразу. Полезно для кэшей, группировки данных и конфигураций, где важна производительность и безопасность. В Chrome 145 эти методы уже работают нативно.
Что такое Map.getOrInsert и зачем оно нужно
Метод Map.prototype.getOrInsert(key, value) проверяет наличие ключа в Map. Если ключ есть, возвращает связанное значение. Если нет - вставляет пару key/value и возвращает value. Всё происходит атомарно, без промежуточных проверок, что минимизирует ошибки в конкурентном доступе.
Раньше разработчики писали boilerplate-код: проверяли has, потом get или set. Это не только verbose, но и рискованно - между has и set другой поток мог изменить Map. Новый метод устраняет эту проблему одним вызовом. Представьте группировку данных: вместо условий просто вызываете getOrInsert(key, []). В Chrome 145 это уже стандарт.
Вот типичные сценарии использования:
- Группировка элементов: let grouped = new Map(); grouped.getOrInsert(key, []).push(item);
- Кэширование: const cache = new Map(); result = cache.getOrInsert(key, computeExpensiveValue());
- Конфигурации: config.getOrInsert(‘theme’, ‘light’);
Сценарий Старый код Новый код с getOrInsert Группировка if (!grouped.has(key)) grouped.set(key, []); grouped.get(key).push(item); grouped.getOrInsert(key, []).push(item); Кэш if (!cache.has(key)) cache.set(key, compute()); return cache.get(key); cache.getOrInsert(key, compute()); Дефолт val = map.get(key) ?? defaultValue; map.set(key, val); map.getOrInsert(key, defaultValue); Важно: Метод бросает TypeError, если Map невалиден. Работает с любыми ключами - примитивами и объектами.
Map.getOrInsertComputed: ленивые вычисления
Map.prototype.getOrInsertComputed(key, callback) похож на getOrInsert, но значение вычисляется функцией callback только если ключа нет. Это идеально, когда дефолт - дорогое вычисление, типа создания объекта или API-запроса.
Без этого приходилось проверять has, а потом в callback всегда вызывать compute - даже зря. Теперь callback вызывается лениво: только при отсутствии ключа. Производительность растёт, особенно в циклах. В спецификации ECMAScript 2026 это четко прописано с шагами: проверка MapData, поиск ключа, вызов closure если нужно.
Примеры реального кода:
- Группировка с пустым массивом: grouped.getOrInsertComputed(key, () => []).push(item);
- Кэш с функцией: cache.getOrInsertComputed(key, () => fetchData(key));
- Объект-конфиг: map.getOrInsertComputed(key, () => new Options());
Метод Аргументы Когда вызывается callback Пример getOrInsert key, value Никогда (value статично) getOrInsert(‘user’, {}) getOrInsertComputed key, () => value Только если !has(key) getOrInsertComputed(‘user’, () => fetchUser()) Преимущества: Избегает ненужных вычислений. Нюанс: callback не принимает аргументы, захватывает контекст через closure.
Атомарность и поддержка в Chrome 145
Атомарность - ключевой плюс: метод гарантирует, что get и insert не прервутся. В спецификации это internal slot [[MapData]] с циклом поиска и вставкой без race conditions. Подходит для SharedArrayBuffer или Worker’ов.
В Chrome 145 методы landed: полная поддержка без флагов. Firefox с 144, Safari с 26.2. Это часть ECMAScript 2026, финализированной в декабре 2025. Старые версии требуют полифиллов из proposal-upsert.
Поддержка браузеров:
- Chrome 145+: Полная
- Firefox 144+: Полная
- Safari 26.2+: Полная
- Edge 145+: Полная
Браузер Версия поддержки Статус Chrome 145 
Firefox 144 
Safari 26.2 
Edge 145 
Совет: Проверяйте caniuse для продакшена. Для WeakMap аналогичные методы.
Перспективы upsert в JavaScript-экосистеме
Методы upsert меняют паттерны: меньше ошибок, чище код. Но остаётся вопрос с полифиллами для старых браузеров и интеграцией в фреймворки типа React/Vue. TC39 продолжает работу над keyed collections.
Дальше ждём оптимизаций для больших Map и возможно расширений на Set. Это шаг к более выразительному API без лямбда-монстров. Стоит протестировать в реальных проектах - разница в читаемости огромна.
Здравствуйте! Похоже, вас заинтересовала эта беседа, но у вас ещё нет аккаунта.
Надоело каждый раз пролистывать одни и те же посты? Зарегистрировав аккаунт, вы всегда будете возвращаться на ту же страницу, где были раньше, и сможете выбирать, получать ли уведомления о новых ответах (по электронной почте или в виде push-уведомлений). Вы также сможете сохранять закладки и ставить лайки постам, чтобы выразить свою благодарность другим участникам сообщества.
С вашими комментариями этот пост мог бы стать ещё лучше 💗
Зарегистрироваться Войти© 2024 - 2026 ExLends, Inc. Все права защищены.