<?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[ECMAScript 2026 вышел: Map.getOrInsert, Set методы и Temporal API меняют разработку]]></title><description><![CDATA[<p dir="auto">ECMAScript 2026 только что вышел, и он приносит долгожданные изменения в JavaScript. Главные новинки - это методы для <strong>Map.getOrInsert</strong> и <strong>Set</strong>, плюс полноценный <strong>Temporal API</strong> для работы с датами. Эти фичи упростят код, сделают его надежнее и избавят от болячек старого Date.</p>
<p dir="auto">Зачем это нужно? Разработчики часто мучаются с проверками ключей в Map или сложными датами в разных зонах. Теперь код станет короче, а ошибки - реже. Давайте разберем, как это работает на практике и почему экосистема разработки уже меняется.</p>
<h2>Map.getOrInsert и новые методы Set: проще манипуляции с данными</h2>
<p dir="auto">Метод <strong>Map.getOrInsert</strong> позволяет сразу получать значение по ключу или вставлять новое, если ключа нет. Это избавляет от шаблонного кода с has() и set(). Представьте: раньше писали if (!map.has(key)) map.set(key, defaultValue); return map.get(key). Теперь один вызов - и готово.</p>
<p dir="auto">Для <strong>Set</strong> добавили методы вроде addIfNotPresent или union/intersection, которые упрощают операции над множествами. Это полезно в алгоритмах, фильтрах данных или кэшах. Например, при объединении наборов пользователей без дубликатов код сокращается вдвое. Такие улучшения ускоряют разработку бэкенда и фронта, где коллекции используются повсеместно.</p>
<p dir="auto">Вот ключевые методы для Map и Set в ES2026:</p>
<ul>
<li><strong>Map.getOrInsert(key, factory)</strong>: возвращает значение или создает через factory-функцию.</li>
<li><strong>Set.union(otherSet)</strong>: возвращает новое множество с объединением.</li>
<li><strong>Set.intersection(otherSet)</strong>: только общие элементы.</li>
<li><strong>Map.merge(otherMap)</strong>: сливает карты с обработкой коллизий.</li>
</ul>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>Метод</th>
<th>Старый способ</th>
<th>Новый способ</th>
</tr>
</thead>
<tbody>
<tr>
<td>Получить/вставить в Map</td>
<td>if (!m.has(k)) m.set(k, v); m.get(k)</td>
<td>m.getOrInsert(k, () =&gt; v)</td>
</tr>
<tr>
<td>Объединение Set</td>
<td>new Set([…s1, …s2])</td>
<td>s1.union(s2)</td>
</tr>
<tr>
<td>Пересечение Set</td>
<td>new Set([…s1].filter(x =&gt; s2.has(x)))</td>
<td>s1.intersection(s2)</td>
</tr>
</tbody>
</table>
<p dir="auto"><em>Важно</em>: factory в getOrInsert вызывается только при отсутствии ключа, что экономит ресурсы.</p>
<h2>Temporal API: прощай, проблемный Date</h2>
<p dir="auto"><strong>Temporal API</strong> - это новая стандартная система для дат и времени, которая заменяет устаревший Date. Date notorious за мутабельность, проблемы с часовыми поясами и неопределенное поведение с leap seconds. Temporal объекты неизменяемы, поддерживают time zones и календари из коробки.</p>
<p dir="auto">Temporal вводит классы вроде Temporal.ZonedDateTime, Temporal.Duration и Temporal.PlainDate. Они парсят ISO 8601 точно, без сюрпризов. Например, добавление дней всегда учитывает месяц и високосные годы. Это критично для приложений с расписаниями, финансовыми транзакциями или международными пользователями.</p>
<p dir="auto">Основные классы Temporal:</p>
<ul>
<li><strong>Temporal.PlainDate</strong>: дата без времени.</li>
<li><strong>Temporal.PlainDateTime</strong>: дата + время.</li>
<li><strong>Temporal.ZonedDateTime</strong>: с часовым поясом.</li>
<li><strong>Temporal.Duration</strong>: разница между датами.</li>
<li><strong>Temporal.Now</strong>: текущая дата/время.</li>
</ul>
<p dir="auto">Пример: const dt = Temporal.Now.zonedDateTimeISO(‘Europe/Moscow’); dt.add({days: 1}).toString() даст точный результат без глюков.</p>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>Свойство</th>
<th>Date</th>
<th>Temporal</th>
</tr>
</thead>
<tbody>
<tr>
<td>Изменяемость</td>
<td>Мутабельный</td>
<td><strong>Неизменяемый</strong></td>
</tr>
<tr>
<td>Time zones</td>
<td>Строки вроде ‘UTC’</td>
<td>Полные идентификаторы</td>
</tr>
<tr>
<td>Календари</td>
<td>Только Gregorian</td>
<td>Любые, включая японский</td>
</tr>
<tr>
<td>Диапазон</td>
<td>Ограничен</td>
<td>От -271821 до +275760 года</td>
</tr>
</tbody>
</table>
<p dir="auto"><em>Нюанс</em>: Temporal использует 24-часовой формат и игнорирует leap seconds для предсказуемости.</p>
<h2>Ресурсное управление: using и await using</h2>
<p dir="auto">ES2026 вводит <strong>using</strong> и <strong>await using</strong> для автоматической очистки ресурсов. Это как RAII в C++ или with в Python - ресурсы вроде файлов или соединений закрываются при выходе из блока, даже при ошибках.</p>
<p dir="auto">Синхронный <strong>using</strong> подходит для локальных файлов, асинхронный <strong>await using</strong> - для сетевых запросов или БД. Переменные блок-локальные и immutable, как const. Нет нужды в try-finally, код чище и безопаснее.</p>
<p dir="auto">Преимущества:</p>
<ul>
<li>Автоматическая утилизация.</li>
<li>Поддержка async/await.</li>
<li>Снижение утечек памяти.</li>
</ul>
<p dir="auto">Пример:</p>
<pre><code class="language-js">await using stream = fetch(url).then(r =&gt; r.body); // stream закроется автоматически
</code></pre>
<h2>Новые инструменты для async и массивов</h2>
<p dir="auto">Появился <strong>Array.fromAsync()</strong> для создания массивов из асинхронных итераторов. Полезно при парсинге данных из API. Также <strong>Error.isError()</strong> для точной проверки ошибок и Base64/HEX для Uint8Array.</p>
<p dir="auto">Это ускоряет работу с данными в Node.js и браузерах. Pattern Matching и Records/Tuples на Stage 3 добавляют функциональность.</p>
<p dir="auto">Ключевые фичи:</p>
<ul>
<li>Array.fromAsync(iterable).</li>
<li>Uint8Array.fromBase64(str).</li>
<li>using res = openFile(path).</li>
</ul>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>Фича</th>
<th>Применение</th>
</tr>
</thead>
<tbody>
<tr>
<td>Array.fromAsync</td>
<td>Параллельный fetch</td>
</tr>
<tr>
<td>using</td>
<td>File handles</td>
</tr>
<tr>
<td>Error.isError</td>
<td>Гибкие проверки</td>
</tr>
</tbody>
</table>
<h2>Temporal меняет правила игры в JS</h2>
<p dir="auto">ES2026 с Map.getOrInsert, Set-методами и Temporal решает накопившиеся проблемы JavaScript. Код становится короче, надежнее, особенно в enterprise-приложениях. Осталось дождаться полной поддержки в Safari и потестировать polyfill’ы.</p>
<p dir="auto">Эти изменения повлияют на библиотеки вроде Moment.js - многие мигрируют на Temporal. Стоит присмотреться к комбинациям с Intl API для локализации.</p>
]]></description><link>https://forum.exlends.ru/topic/1157/ecmascript-2026-vyshel-map.getorinsert-set-metody-i-temporal-api-menyayut-razrabotku</link><generator>RSS for Node</generator><lastBuildDate>Sat, 17 Oct 2026 03:26:01 GMT</lastBuildDate><atom:link href="https://forum.exlends.ru/topic/1157.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 05 Mar 2026 13:39:51 GMT</pubDate><ttl>60</ttl></channel></rss>