<?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 издан: Temporal API, Map.getOrInsert и новые методы массивов меняют JavaScript]]></title><description><![CDATA[<p dir="auto">ECMAScript 2026 официально издан, и это серьезный апгрейд для JavaScript. В него вошли Temporal API для работы с датами, метод Map.getOrInsert и новые методы массивов. Эти изменения решают старые проблемы разработчиков, упрощают код и повышают надежность приложений.</p>
<p dir="auto">Temporal устраняет баги Date, Map.getOrInsert экономит время на проверках, а методы массивов ускоряют обработку данных. Теперь можно писать чище и быстрее код для фронтенда, бэкенда и мобильных приложений. Это особенно полезно для команд, где ошибки с датами или коллекциями тормозят релиз.</p>
<h2>Temporal API - прощай, проблемный Date</h2>
<p dir="auto">Temporal API наконец-то заменяет устаревший Date в ECMAScript 2026. Этот namespace вводит immutable объекты для дат, времени, зон и длительностей. Нет больше мутаций, путаницы с часовыми поясами или неудобного парсинга строк. Temporal поддерживает календари, включая григорианский, и работает с наносекундами.</p>
<p dir="auto">Представьте: раньше Date мутировал при любом setter, вызывая side effects. Теперь все объекты неизменяемы - вызов метода возвращает новый экземпляр. Это упрощает параллельный код и тестирование. Temporal также имеет встроенные методы для сравнений, округлений и арифметики дат. Логично перейти к примерам классов.</p>
<p dir="auto">Вот ключевые классы Temporal:</p>
<ul>
<li><strong>Temporal.Instant</strong> - уникальная точка во времени как timestamp.</li>
<li><strong>Temporal.ZonedDateTime</strong> - дата-время с часовым поясом, автоматически учитывает DST.</li>
<li><strong>Temporal.PlainDate</strong> - просто дата без времени, идеально для дней рождения.</li>
<li><strong>Temporal.Duration</strong> - разница между датами, с методами add и subtract.</li>
</ul>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>Класс</th>
<th>Что представляет</th>
<th>Пример использования</th>
</tr>
</thead>
<tbody>
<tr>
<td>Temporal.PlainDateTime</td>
<td>Дата и время без зоны</td>
<td>let dt = Temporal.PlainDateTime.from(‘2026-03-05T11:00’);</td>
</tr>
<tr>
<td>Temporal.PlainTime</td>
<td>Только время</td>
<td>let time = Temporal.PlainTime.from(‘11:07:31’);</td>
</tr>
<tr>
<td>Temporal.Now</td>
<td>Текущее время</td>
<td>let now = Temporal.Now.zonedDateTimeISO(‘Europe/Moscow’);</td>
</tr>
</tbody>
</table>
<p dir="auto"><em>Важно: диапазон дат - от -271821 года до +275760, как в Date, но с лучшей точностью.</em></p>
<p dir="auto">Пример кода для разницы во времени:</p>
<pre><code class="language-javascript">const now = Temporal.Now.instant();
const future = Temporal.Instant.fromEpochMilliseconds(1851222399924);
const duration = now.until(future, { smallestUnit: 'hour' });
console.log(duration.toLocaleString('ru-RU')); // Выводит длительность на русском
</code></pre>
<h2>Map.getOrInsert - удобство для коллекций</h2>
<p dir="auto">В ES2026 Map получает метод getOrInsert, который проверяет ключ и вставляет значение, если его нет. Это как upsert в базах данных - атомарная операция без ручных if. Раньше приходилось писать Map.has() + Map.set(), что уродовало код и рисковало race conditions в асинхронке.</p>
<p dir="auto">Метод принимает ключ и функцию-фабрику значения. Если ключ существует, возвращает существующее; иначе создает новое и вставляет. Это ускоряет кэширование, счетчики и конфиги. Подходит для серверов, где Map хранит сессии или кэш запросов. Теперь код короче и безопаснее.</p>
<p dir="auto">Преимущества getOrInsert:</p>
<ul>
<li>Атомарность - нет промежуточных проверок.</li>
<li>Lazy инициализация - значение создается только при необходимости.</li>
<li>Совместимость с существующими Map.</li>
</ul>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>Старый способ</th>
<th>Новый способ с getOrInsert</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>if (!map.has(key)) map.set(key, computeValue(key)); return map.get(key);</code></td>
<td><code>return map.getOrInsert(key, computeValue);</code></td>
</tr>
<tr>
<td>Длинный, подвержен ошибкам</td>
<td>Короткий, надежный</td>
</tr>
</tbody>
</table>
<p dir="auto"><em>Нюанс: фабрика вызывается только один раз, даже в многопотоке, благодаря внутренним lock’ам.</em></p>
<p dir="auto">Пример для счетчика посещений:</p>
<pre><code class="language-javascript">const visits = new Map();
const count = visits.getOrInsert(userId, () =&gt; 0) + 1;
visits.set(userId, count);
</code></pre>
<h2>Новые методы массивов - мощь для данных</h2>
<p dir="auto">ES2026 добавляет методы для массивов, упрощающие группировку, фильтрацию и трансформации. Это продолжение эволюции от flatMap и at в прошлых версиях. Теперь есть groupBy, toSorted, toReversed - все immutable, возвращают новый массив. Идеально для реактивных UI и data processing.</p>
<p dir="auto">Раньше сортировка мутировала массив sort(), что ломало состояние в React или Vue. Новые toSorted и toReversed создают копию. GroupBy агрегирует по ключу, как lodash groupBy. Это ускоряет ETL в Node.js и фронте. Логично разобрать на примерах.</p>
<p dir="auto">Ключевые новые методы:</p>
<ul>
<li><strong>Array.prototype.groupBy</strong> - группирует по callback.</li>
<li><strong>Array.prototype.toSorted</strong> - сортировка с копированием.</li>
<li><strong>Array.prototype.toReversed</strong> - реверс без мутации.</li>
</ul>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>Метод</th>
<th>Старая альтернатива</th>
<th>Преимущество</th>
</tr>
</thead>
<tbody>
<tr>
<td>toSorted(compareFn)</td>
<td>[…arr].sort(compareFn)</td>
<td>Immutable, короче</td>
</tr>
<tr>
<td>groupBy(keyFn)</td>
<td>lodash.groupBy(arr, keyFn)</td>
<td>Встроенный, без deps</td>
</tr>
<tr>
<td>toReversed()</td>
<td>[…arr].reverse()</td>
<td>Не меняет оригинал</td>
</tr>
</tbody>
</table>
<p dir="auto">Пример группировки пользователей:</p>
<pre><code class="language-javascript">const users = [{name: 'Алекс', age: 30}, {name: 'Маша', age: 25}, {name: 'Алекс', age: 35}];
const byAge = users.groupBy(u =&gt; u.age &gt; 28 ? 'adult' : 'young');
console.log(byAge); // { adult: , young: [...] }
</code></pre>
<h2>Что Temporal и новинки меняют в проектах</h2>
<p dir="auto">ES2026 делает JavaScript зрелым языком для enterprise. Temporal решает 20-летние боли с датами, Map.getOrInsert упрощает коллекции, методы массивов - data flow. Браузеры и Node.js внедрят это скоро, полифиллы уже есть.</p>
<p dir="auto">Осталось дождаться полной поддержки в движках. Подумайте, как мигрировать legacy Date в проектах - тесты покажут выгоду. Новые фичи сочетаются с async и modules, усиливая JS в 2026.</p>
]]></description><link>https://forum.exlends.ru/topic/1141/ecmascript-2026-izdan-temporal-api-map.getorinsert-i-novye-metody-massivov-menyayut-javascript</link><generator>RSS for Node</generator><lastBuildDate>Sat, 17 Oct 2026 04:06:13 GMT</lastBuildDate><atom:link href="https://forum.exlends.ru/topic/1141.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 05 Mar 2026 11:07:49 GMT</pubDate><ttl>60</ttl></channel></rss>