Chrome 145 внедряет Map.getOrInsert: атомарные операции для Map в JavaScript
-
Chrome 145 принес важное обновление для JavaScript - методы Map.getOrInsert и Map.getOrInsertComputed. Эти функции упрощают работу с коллекциями, избавляя от ручных проверок has() и set(). Теперь разработчики могут атомарно получать значение или вставлять дефолтное, что ускоряет код и снижает ошибки в многопоточных сценариях.
Это особенно полезно в приложениях с динамическими данными, как кэши, настройки пользователей или агрегация событий. Такие операции раньше требовали нескольких шагов, что могло привести к race conditions. С новыми методами код становится чище и надежнее.
Как работает Map.getOrInsert
Метод Map.getOrInsert(key, defaultValue) возвращает значение по ключу, если оно есть, или вставляет defaultValue и возвращает его. Это эквивалентно проверке if (map.has(key)) return map.get(key); else { map.set(key, defaultValue); return defaultValue; }. Разница в атомарности - метод выполняется за один шаг, без промежуточных состояний.
Представьте Map для пользовательских предпочтений. Если тема не задана, метод сам вставит “light”. Позже код спокойно обращается к значению без дополнительных проверок. Это нормирует ввод и предотвращает undefined ошибки. В реальных проектах такая логика встречается повсеместно - от конфигов до сессий.
- Атомарность: Метод гарантирует, что get и set происходят без прерываний, идеально для Web Workers или shared state.
- Простота: Заменяет 4-5 строк кода на одну.
- Производительность: Меньше обращений к Map, что заметно в циклах с тысячами ключей.
Сценарий Старый код Новый код с getOrInsert Получить или дефолт if (!map.has(key)) map.set(key, def); return map.get(key); map.getOrInsert(key, def) Массив по ключу if (!map.has(key)) map.set(key, []); map.get(key).push(val); map.getOrInsert(key, []).push(val) Объект с полем let obj = map.get(key) ?? {}; obj.field = val; map.set(key, obj); let obj = map.getOrInsert(key, {}); obj.field = val; Map.getOrInsertComputed для ленивых вычислений
Этот метод похож, но defaultValue - это функция, которая вызывается только если ключа нет. Полезно, когда дефолт дорог в вычислении, например, создание сложного объекта или запрос к API. Синтаксис: map.getOrInsertComputed(key, () => computeDefault()). Функция получает ключ как аргумент.
В кэше изображений метод создаст заглушку только при отсутствии. Или в агрегации логов - посчитает статистику по ключу динамически. Это экономит ресурсы, избегая ненужных вычислений. В больших приложениях разница в памяти и CPU ощутима.
- Вызов только по необходимости: Функция не запускается, если значение уже есть.
- Доступ к ключу: () => { … use key … } позволяет персонализировать дефолт.
- WeakMap поддержка: Аналогичные методы для WeakMap, где ключи - объекты.
Метод Когда использовать Пример getOrInsert Простой дефолт (число, строка, []) options.getOrInsert(‘theme’, ‘light’) getOrInsertComputed Дорогой дефолт (объект, вычисления) cache.getOrInsertComputed(id, () => fetchData(id)) WeakMap версия Ключи - DOM элементы nodes.getOrInsertComputed(node, () => processNode(node)) Поддержка в браузерах и миграция
Chrome 145 первым ввел эти методы полностью. Firefox с 144, Safari с 26.2 тоже поддерживают. В Edge - с 145. Для старых версий используйте полифилл: простая функция, оборачивающая has/get/set. Но с 2026 года большинство пользователей на актуальных браузерах.
Проверьте caniuse.com/mdn-javascript_builtins_map_getorinsert - там полная таблица. В проектах добавьте feature detection: if (typeof Map.prototype.getOrInsert === ‘function’). Миграция тривиальна - ищите паттерны get ?? set и заменяйте. Тестируйте на edge-кейсах вроде null/undefined значений.
- Chrome 145+: Полная поддержка Map и WeakMap.
- Полифилл: function getOrInsert(key, def) { if (this.has(key)) return this.get(key); this.set(key, def); return def; } Map.prototype.getOrInsert = getOrInsert;
- Совместимость: Не ломает старый код, новые методы опциональны.
Что меняет upsert в реальных проектах
Upsert операции упрощают state management в React/Vue, особенно с мемоизацией. В Node.js - для сессий и кэшей. Представьте счетчик событий: map.getOrInsert(eventType, 0) + 1;. Код короче, читаемее, меньше багов от race conditions в асинхронных обновлениях.
Эти методы - шаг к более функциональному JS, как в Rust или Go коллекциях. Остается внедрение в Array/Set аналогов и стандартизация WeakRef с upsert. Стоит поэкспериментировать в прототипах - увидите, как код оживает.
Поддержка растет, но для enterprise проверяйте флот браузеров. Дальше ждем стабилизации в ECMAScript и инструментов для отладки Map.
Здравствуйте! Похоже, вас заинтересовала эта беседа, но у вас ещё нет аккаунта.
Надоело каждый раз пролистывать одни и те же посты? Зарегистрировав аккаунт, вы всегда будете возвращаться на ту же страницу, где были раньше, и сможете выбирать, получать ли уведомления о новых ответах (по электронной почте или в виде push-уведомлений). Вы также сможете сохранять закладки и ставить лайки постам, чтобы выразить свою благодарность другим участникам сообщества.
С вашими комментариями этот пост мог бы стать ещё лучше 💗
Зарегистрироваться Войти© 2024 - 2026 ExLends, Inc. Все права защищены.