<?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 для атомарных операций в коллекциях JavaScript]]></title><description><![CDATA[<p dir="auto">В Chrome 145 появился метод <strong>Map.getOrInsert()</strong>, который упрощает работу с коллекциями. Он возвращает значение по ключу или вставляет значение по умолчанию, если ключа нет. Это решает проблему повторных проверок has() и set(), делая код чище и быстрее.</p>
<p dir="auto">Метод полезен для кэшей, настройки пользователей и списков, где нужно гарантировать наличие значения. Теперь не нужно писать if (map.has(key)) - всё в одной строке. Атомарность операции минимизирует race conditions в многопоточных сценариях, хотя JS однопоточный.</p>
<h2>Что такое Map.getOrInsert и зачем он нужен</h2>
<p dir="auto">Метод <strong>Map.prototype.getOrInsert(key, defaultValue)</strong> проверяет наличие ключа в 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’) без проверок. Без метода код раздувается, а с ним - лаконично.### Основные сценарии использования</p>
<ul>
<li><strong>Кэширование массивов</strong>: map.getOrInsert(key, []).push(value); Массив создаётся только при необходимости.- <strong>Настройки по умолчанию</strong>: options.getOrInsert(‘mode’, ‘default’); Упрощает обработку конфигов.- <strong>Группировка данных</strong>: Собираете статистику по ключам без лишних if’ов.</li>
</ul>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>Сценарий</th>
<th>До getOrInsert</th>
<th>С getOrInsert</th>
</tr>
</thead>
<tbody>
<tr>
<td>Кэш массива</td>
<td>if (!map.has(key)) map.set(key, []); map.get(key).push(value);</td>
<td>map.getOrInsert(key, []).push(value);</td>
</tr>
<tr>
<td>Значение по умолчанию</td>
<td>map.get(key) ?? map.set(key, def); map.get(key);</td>
<td>map.getOrInsert(key, def);</td>
</tr>
<tr>
<td>WeakMap для объектов</td>
<td>Аналогично, но с WeakMap для GC.</td>
<td>weakMap.getOrInsert(key, {});</td>
</tr>
</tbody>
</table>
<h2>getOrInsertComputed для ленивых вычислений</h2>
<p dir="auto">Есть ещё <strong>Map.prototype.getOrInsertComputed(key, computeFn)</strong>, где computeFn вызывается только если ключа нет. Это важно, если создание defaultValue дорогое - например, сложный объект или запрос.Без него computeFn мог бы выполняться зря. Пример: map.getOrInsertComputed(‘data’, () =&gt; fetchData(key)); fetchData сработает только при отсутствии ключа. В Chrome 145 это нативно, без polyfill’ов.Аналогично для WeakMap, что полезно для приватных данных объектов. Метод атомарен: нет промежуточных состояний, где ключ есть без значения. Это упрощает многопоточные расширения JS в будущем.### Преимущества над старыми паттернами</p>
<ul>
<li><em>Вызов computeFn только при необходимости</em> - экономит ресурсы.- <strong>Атомарность</strong> - вставка и возврат в одной операции, без race conditions.- Поддержка в WeakMap - не мешает garbage collection.## Поддержка в браузерах и миграция</li>
</ul>
<p dir="auto">Chrome 145 ввёл поддержку <strong>Map.getOrInsert</strong> �� версии 145, Firefox - с 144, Safari - 26.2.Edge пока отстаёт до 144 -, но скоро догонит. Для старых браузеров используйте полифилл или проверку.</p>
<p dir="auto">Проверить поддержку: if (‘getOrInsert’ in Map.prototype). В проектах с транспиляцией Babel добавит полифилл автоматически. В Chrome 145 это stable фича из ECMAScript proposal.Тестирование просто: создайте Map, вызовите getOrInsert на отсутствующем ключе - значение вставится. Для WeakMap то же самое, но ключи должны быть объектами.### Браузерная совместимость</p>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>- <strong>Chrome 145+</strong>: Полная поддержка.- <strong>Firefox 144+</strong>: Есть.- <strong>Safari 26.2+</strong>: Поддерживается.- <strong>Edge</strong>: С 145 ожидаемо, пока нет.</th>
<th>Браузер</th>
<th>Версия поддержки</th>
<th>Примечание</th>
</tr>
</thead>
<tbody>
<tr>
<td>Chrome</td>
<td>145</td>
<td>Stable</td>
</tr>
<tr>
<td>Firefox</td>
<td>144</td>
<td>Полная</td>
</tr>
<tr>
<td>Safari</td>
<td>26.2</td>
<td>iOS включено</td>
</tr>
<tr>
<td>Edge</td>
<td>145?</td>
<td>В разработке</td>
</tr>
</tbody>
</table>
<h2>Практические примеры в реальном коде</h2>
<p dir="auto">В веб-приложениях Map.getOrInsert идеален для user sessions. const sessions = new Map(); sessions.getOrInsert(userId, () =&gt; ({ visits: 0, last: Date.now() })).visits++; Счётчик визитов без проверок.Для группировки логов: logs.getOrInsert(category, []).push(entry); Массивы создаются лениво. В React/Vue - для stateful кэшей компонентов. WeakMap.getOrInsert(this, () =&gt; createCache()); Приватный кэш на экземпляр.Избегайте с null/undefined как валидными значениями - метод не отличит отсутствие от них. Используйте getOrInsertComputed для динамики. В production мониторьте производительность - метод быстрее ручных проверок на 20-30% в циклах.### Кодовые сниппеты</p>
<pre><code class="language-javascript">const map = new Map(&lsqb;&lsqb;'bar', 'foo'&rsqb;&rsqb;);
console.log(map.getOrInsert('bar', 'default')); // 'foo'
console.log(map.getOrInsert('baz', 'default')); // 'default', вставлено```

```javascript
const computedMap = new Map();
computedMap.getOrInsertComputed('expensive', () =&gt; heavyCompute()); // compute только раз
</code></pre>
<h2>Новые горизонты с upsert в коллекциях</h2>
<p dir="auto">Chrome 145 сделал Map мощнее для атомарных upsert-операций, но есть getOrInsertWith для мутаций. Стоит поэкспериментировать с WeakMap в фреймворках - приватные кэши упростятся.Дальше ждём полную экосистемную поддержку и оптимизации под V8. Это шаг к более declarative JS, где boilerplate уходит в runtime.</p>
]]></description><link>https://forum.exlends.ru/topic/1441/chrome-145-map.getorinsert-dlya-atomarnyh-operacij-v-kollekciyah-javascript</link><generator>RSS for Node</generator><lastBuildDate>Sat, 17 Oct 2026 04:06:02 GMT</lastBuildDate><atom:link href="https://forum.exlends.ru/topic/1441.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 09 Mar 2026 05:53:27 GMT</pubDate><ttl>60</ttl></channel></rss>