Chrome 145: Map.getOrInsert для атомарных операций в коллекциях JavaScript
-
В Chrome 145 появился метод Map.getOrInsert(), который упрощает работу с коллекциями. Он возвращает значение по ключу или вставляет значение по умолчанию, если ключа нет. Это решает проблему повторных проверок has() и set(), делая код чище и быстрее.
Метод полезен для кэшей, настройки пользователей и списков, где нужно гарантировать наличие значения. Теперь не нужно писать if (map.has(key)) - всё в одной строке. Атомарность операции минимизирует race conditions в многопоточных сценариях, хотя JS однопоточный.
Что такое Map.getOrInsert и зачем он нужен
Метод Map.prototype.getOrInsert(key, defaultValue) проверяет наличие ключа в Map. Если ключ есть, возвращает его значение. Если нет - вставляет defaultValue и возвращает его. Это эквивалентно классическому паттерну if (map.has(key)) return map.get(key); else map.set(key, defaultValue); return defaultValue;.Раньше разработчики часто писали такие проверки вручную, что приводило к дублированию кода. В Chrome 145 это стало нативным методом, поддерживаемым в Map и WeakMap. Пример: const map = new Map(); map.getOrInsert(‘theme’, ‘light’); Теперь ‘theme’ гарантированно есть с значением ‘light’.Это особенно удобно для нормализации данных. Представьте Map с предпочтениями пользователя: опции.getOrInsert(‘fontSize’, 14); Затем безопасно используете options.get(‘fontSize’) без проверок. Без метода код раздувается, а с ним - лаконично.### Основные сценарии использования
- Кэширование массивов: map.getOrInsert(key, []).push(value); Массив создаётся только при необходимости.- Настройки по умолчанию: options.getOrInsert(‘mode’, ‘default’); Упрощает обработку конфигов.- Группировка данных: Собираете статистику по ключам без лишних if’ов.
Сценарий До getOrInsert С getOrInsert Кэш массива if (!map.has(key)) map.set(key, []); map.get(key).push(value); map.getOrInsert(key, []).push(value); Значение по умолчанию map.get(key) ?? map.set(key, def); map.get(key); map.getOrInsert(key, def); WeakMap для объектов Аналогично, но с WeakMap для GC. weakMap.getOrInsert(key, {}); getOrInsertComputed для ленивых вычислений
Есть ещё Map.prototype.getOrInsertComputed(key, computeFn), где computeFn вызывается только если ключа нет. Это важно, если создание defaultValue дорогое - например, сложный объект или запрос.Без него computeFn мог бы выполняться зря. Пример: map.getOrInsertComputed(‘data’, () => fetchData(key)); fetchData сработает только при отсутствии ключа. В Chrome 145 это нативно, без polyfill’ов.Аналогично для WeakMap, что полезно для приватных данных объектов. Метод атомарен: нет промежуточных состояний, где ключ есть без значения. Это упрощает многопоточные расширения JS в будущем.### Преимущества над старыми паттернами
- Вызов computeFn только при необходимости - экономит ресурсы.- Атомарность - вставка и возврат в одной операции, без race conditions.- Поддержка в WeakMap - не мешает garbage collection.## Поддержка в браузерах и миграция
Chrome 145 ввёл поддержку Map.getOrInsert �� версии 145, Firefox - с 144, Safari - 26.2.Edge пока отстаёт до 144 -, но скоро догонит. Для старых браузеров используйте полифилл или проверку.
Проверить поддержку: if (‘getOrInsert’ in Map.prototype). В проектах с транспиляцией Babel добавит полифилл автоматически. В Chrome 145 это stable фича из ECMAScript proposal.Тестирование просто: создайте Map, вызовите getOrInsert на отсутствующем ключе - значение вставится. Для WeakMap то же самое, но ключи должны быть объектами.### Браузерная совместимость
- Chrome 145+: Полная поддержка.- Firefox 144+: Есть.- Safari 26.2+: Поддерживается.- Edge: С 145 ожидаемо, пока нет. Браузер Версия поддержки Примечание Chrome 145 Stable Firefox 144 Полная Safari 26.2 iOS включено Edge 145? В разработке Практические примеры в реальном коде
В веб-приложениях Map.getOrInsert идеален для user sessions. const sessions = new Map(); sessions.getOrInsert(userId, () => ({ visits: 0, last: Date.now() })).visits++; Счётчик визитов без проверок.Для группировки логов: logs.getOrInsert(category, []).push(entry); Массивы создаются лениво. В React/Vue - для stateful кэшей компонентов. WeakMap.getOrInsert(this, () => createCache()); Приватный кэш на экземпляр.Избегайте с null/undefined как валидными значениями - метод не отличит отсутствие от них. Используйте getOrInsertComputed для динамики. В production мониторьте производительность - метод быстрее ручных проверок на 20-30% в циклах.### Кодовые сниппеты
const map = new Map([['bar', 'foo']]); console.log(map.getOrInsert('bar', 'default')); // 'foo' console.log(map.getOrInsert('baz', 'default')); // 'default', вставлено``` ```javascript const computedMap = new Map(); computedMap.getOrInsertComputed('expensive', () => heavyCompute()); // compute только разНовые горизонты с upsert в коллекциях
Chrome 145 сделал Map мощнее для атомарных upsert-операций, но есть getOrInsertWith для мутаций. Стоит поэкспериментировать с WeakMap в фреймворках - приватные кэши упростятся.Дальше ждём полную экосистемную поддержку и оптимизации под V8. Это шаг к более declarative JS, где boilerplate уходит в runtime.
Здравствуйте! Похоже, вас заинтересовала эта беседа, но у вас ещё нет аккаунта.
Надоело каждый раз пролистывать одни и те же посты? Зарегистрировав аккаунт, вы всегда будете возвращаться на ту же страницу, где были раньше, и сможете выбирать, получать ли уведомления о новых ответах (по электронной почте или в виде push-уведомлений). Вы также сможете сохранять закладки и ставить лайки постам, чтобы выразить свою благодарность другим участникам сообщества.
С вашими комментариями этот пост мог бы стать ещё лучше 💗
Зарегистрироваться Войти© 2024 - 2026 ExLends, Inc. Все права защищены.