<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Chrome 145 внедряет Map.getOrInsert: атомарные операции для Map в JavaScript]]></title><description><![CDATA[<p dir="auto">Chrome 145 принес важное обновление для JavaScript - методы Map.getOrInsert и Map.getOrInsertComputed. Эти функции упрощают работу с коллекциями, избавляя от ручных проверок has() и set(). Теперь разработчики могут атомарно получать значение или вставлять дефолтное, что ускоряет код и снижает ошибки в многопоточных сценариях.</p>
<p dir="auto">Это особенно полезно в приложениях с динамическими данными, как кэши, настройки пользователей или агрегация событий. Такие операции раньше требовали нескольких шагов, что могло привести к race conditions. С новыми методами код становится чище и надежнее.</p>
<h2>Как работает Map.getOrInsert</h2>
<p dir="auto">Метод Map.getOrInsert(key, defaultValue) возвращает значение по ключу, если оно есть, или вставляет defaultValue и возвращает его. Это эквивалентно проверке if (map.has(key)) return map.get(key); else { map.set(key, defaultValue); return defaultValue; }. Разница в атомарности - метод выполняется за один шаг, без промежуточных состояний.</p>
<p dir="auto">Представьте Map для пользовательских предпочтений. Если тема не задана, метод сам вставит “light”. Позже код спокойно обращается к значению без дополнительных проверок. Это нормирует ввод и предотвращает undefined ошибки. В реальных проектах такая логика встречается повсеместно - от конфигов до сессий.</p>
<ul>
<li><strong>Атомарность</strong>: Метод гарантирует, что get и set происходят без прерываний, идеально для Web Workers или shared state.</li>
<li><strong>Простота</strong>: Заменяет 4-5 строк кода на одну.</li>
<li><strong>Производительность</strong>: Меньше обращений к Map, что заметно в циклах с тысячами ключей.</li>
</ul>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>Сценарий</th>
<th>Старый код</th>
<th>Новый код с getOrInsert</th>
</tr>
</thead>
<tbody>
<tr>
<td>Получить или дефолт</td>
<td>if (!map.has(key)) map.set(key, def); return map.get(key);</td>
<td>map.getOrInsert(key, def)</td>
</tr>
<tr>
<td>Массив по ключу</td>
<td>if (!map.has(key)) map.set(key, []); map.get(key).push(val);</td>
<td>map.getOrInsert(key, []).push(val)</td>
</tr>
<tr>
<td>Объект с полем</td>
<td>let obj = map.get(key) ?? {}; obj.field = val; map.set(key, obj);</td>
<td>let obj = map.getOrInsert(key, {}); obj.field = val;</td>
</tr>
</tbody>
</table>
<h2>Map.getOrInsertComputed для ленивых вычислений</h2>
<p dir="auto">Этот метод похож, но defaultValue - это функция, которая вызывается только если ключа нет. Полезно, когда дефолт дорог в вычислении, например, создание сложного объекта или запрос к API. Синтаксис: map.getOrInsertComputed(key, () =&gt; computeDefault()). Функция получает ключ как аргумент.</p>
<p dir="auto">В кэше изображений метод создаст заглушку только при отсутствии. Или в агрегации логов - посчитает статистику по ключу динамически. Это экономит ресурсы, избегая ненужных вычислений. В больших приложениях разница в памяти и CPU ощутима.</p>
<ul>
<li><em>Вызов только по необходимости</em>: Функция не запускается, если значение уже есть.</li>
<li><strong>Доступ к ключу</strong>: () =&gt; { … use key … } позволяет персонализировать дефолт.</li>
<li><strong>WeakMap поддержка</strong>: Аналогичные методы для WeakMap, где ключи - объекты.</li>
</ul>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>Метод</th>
<th>Когда использовать</th>
<th>Пример</th>
</tr>
</thead>
<tbody>
<tr>
<td>getOrInsert</td>
<td>Простой дефолт (число, строка, [])</td>
<td>options.getOrInsert(‘theme’, ‘light’)</td>
</tr>
<tr>
<td>getOrInsertComputed</td>
<td>Дорогой дефолт (объект, вычисления)</td>
<td>cache.getOrInsertComputed(id, () =&gt; fetchData(id))</td>
</tr>
<tr>
<td>WeakMap версия</td>
<td>Ключи - DOM элементы</td>
<td>nodes.getOrInsertComputed(node, () =&gt; processNode(node))</td>
</tr>
</tbody>
</table>
<h2>Поддержка в браузерах и миграция</h2>
<p dir="auto">Chrome 145 первым ввел эти методы полностью. Firefox с 144, Safari с 26.2 тоже поддерживают. В Edge - с 145. Для старых версий используйте полифилл: простая функция, оборачивающая has/get/set. Но с 2026 года большинство пользователей на актуальных браузерах.</p>
<p dir="auto">Проверьте <a href="http://caniuse.com/mdn-javascript_builtins_map_getorinsert" target="_blank" rel="noopener noreferrer">caniuse.com/mdn-javascript_builtins_map_getorinsert</a> - там полная таблица. В проектах добавьте feature detection: if (typeof Map.prototype.getOrInsert === ‘function’). Миграция тривиальна - ищите паттерны get ?? set и заменяйте. Тестируйте на edge-кейсах вроде null/undefined значений.</p>
<ul>
<li><strong>Chrome 145+</strong>: Полная поддержка Map и WeakMap.</li>
<li><em>Полифилл</em>: function getOrInsert(key, def) { if (this.has(key)) return this.get(key); this.set(key, def); return def; } Map.prototype.getOrInsert = getOrInsert;</li>
<li><strong>Совместимость</strong>: Не ломает старый код, новые методы опциональны.</li>
</ul>
<h2>Что меняет upsert в реальных проектах</h2>
<p dir="auto">Upsert операции упрощают state management в React/Vue, особенно с мемоизацией. В Node.js - для сессий и кэшей. Представьте счетчик событий: map.getOrInsert(eventType, 0) + 1;. Код короче, читаемее, меньше багов от race conditions в асинхронных обновлениях.</p>
<p dir="auto">Эти методы - шаг к более функциональному JS, как в Rust или Go коллекциях. Остается внедрение в Array/Set аналогов и стандартизация WeakRef с upsert. Стоит поэкспериментировать в прототипах - увидите, как код оживает.</p>
<p dir="auto">Поддержка растет, но для enterprise проверяйте флот браузеров. Дальше ждем стабилизации в ECMAScript и инструментов для отладки Map.</p>
]]></description><link>https://forum.exlends.ru/topic/1432/chrome-145-vnedryaet-map.getorinsert-atomarnye-operacii-dlya-map-v-javascript</link><generator>RSS for Node</generator><lastBuildDate>Sat, 17 Oct 2026 03:53:24 GMT</lastBuildDate><atom:link href="https://forum.exlends.ru/topic/1432.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 09 Mar 2026 04:22:16 GMT</pubDate><ttl>60</ttl></channel></rss>