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

Map.getOrInsert в ECMAScript 2026: атомарные операции для Map в Chrome 145

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

    В 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 без лямбда-монстров. Стоит протестировать в реальных проектах - разница в читаемости огромна.

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

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

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

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

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

    Категории

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

    Контакты

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

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

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

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

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