Перейти к содержанию
  • Лента
  • Категории
  • Последние
  • Метки
  • Популярные
  • Пользователи
  • Группы
Свернуть
exlends
Категории
  1. Главная
  2. Категории
  3. Языки программирования
  4. JavaScript
  5. Chrome 145: Map.getOrInsert для атомарных операций в коллекциях JavaScript

Chrome 145: Map.getOrInsert для атомарных операций в коллекциях JavaScript

Запланировано Прикреплена Закрыта Перенесена JavaScript
chrome 145map.getorinsertjavascript
1 Сообщения 1 Постеры 68 Просмотры
  • Сначала старые
  • Сначала новые
  • По количеству голосов
Ответить
  • Ответить, создав новую тему
Авторизуйтесь, чтобы ответить
Эта тема была удалена. Только пользователи с правом управления темами могут её видеть.
  • hannadevH Не в сети
    hannadevH Не в сети
    hannadev
    написал в отредактировано
    #1

    В 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.

    1 ответ Последний ответ
    0

    Здравствуйте! Похоже, вас заинтересовала эта беседа, но у вас ещё нет аккаунта.

    Надоело каждый раз пролистывать одни и те же посты? Зарегистрировав аккаунт, вы всегда будете возвращаться на ту же страницу, где были раньше, и сможете выбирать, получать ли уведомления о новых ответах (по электронной почте или в виде push-уведомлений). Вы также сможете сохранять закладки и ставить лайки постам, чтобы выразить свою благодарность другим участникам сообщества.

    С вашими комментариями этот пост мог бы стать ещё лучше 💗

    Зарегистрироваться Войти

    Категории

    • Главная
    • Новости
    • Фронтенд
    • Бекенд
    • Языки программирования

    Контакты

    • Сотрудничество
    • info@exlends.com

    © 2024 - 2026 ExLends, Inc. Все права защищены.

    Политика конфиденциальности
    • Войти

    • Нет учётной записи? Зарегистрироваться

    • Войдите или зарегистрируйтесь для поиска.
    • Первое сообщение
      Последнее сообщение
    0
    • Лента
    • Категории
    • Последние
    • Метки
    • Популярные
    • Пользователи
    • Группы