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

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

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

    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.

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

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

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

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

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

    Категории

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

    Контакты

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

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

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

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

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