<?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: причины и последствия]]></title><description><![CDATA[<p dir="auto">В ECMAScript 2026 не вошли кортежи и записи - популярные предложения для JavaScript. Это решение TC39 повлияло на то, как разработчики строят код с составными данными. Разберём, почему так вышло и что это значит для проектов.</p>
<p dir="auto">Понимание причин поможет выбрать альтернативы и избежать ловушек в новых фичах. Статья покажет аргументы комитета, реальные примеры и пути обхода. Это сэкономит время на миграцию и оптимизацию кода под ES2026.</p>
<h2>Причины отказа от кортежей и записей</h2>
<p dir="auto">Предложения по <strong>кортежам</strong> (tuples) и <strong>записям</strong> (records) шли от Акселя Раушмайера. Они обещали удобные составные типы: кортежи - упорядоченные immutable коллекции, записи - именованные поля без прототипов. TC39 обсуждал их годами, но в итоге отложил на неопределённый срок. Основная причина - несогласие по семантике и сложности реализации в движках вроде V8 и SpiderMonkey.</p>
<p dir="auto">Комитет отметил проблемы с <strong>равенством</strong> и <strong>сериализацией</strong>. Например, кортежи должны сравниваться по значению, но это конфликтует с объектами. Вупоминается, что ES2026 фокусируется на зрелых фичах вроде методов массивов и Promise.try. Предложения не дошли до stage 4 к марту 2026. Разработчики ждали статической типизации, но получили приоритет на производительность модулей.</p>
<ul>
<li><strong>Семантические конфликты</strong>: Кортежи требуют новых правил для ===, что ломает legacy-код с массивами.</li>
<li><strong>Реализация в движках</strong>: V8 тестировал прототипы, но нашёл overhead в 15-20% по памяти.</li>
<li><strong>Альтернативы уже есть</strong>: Массивы и Map покрывают 90% случаев без новых синтаксисов.</li>
<li><strong>Отложено, не отвергнуто</strong>: Может вернуться в ES2027 с доработками.</li>
</ul>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>Аспект</th>
<th>Кортежи/записи</th>
<th>Текущие альтернативы</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Неизменяемость</strong></td>
<td>Встроенная</td>
<td>Object.freeze() или const</td>
</tr>
<tr>
<td><strong>Сравнение</strong></td>
<td>По значению</td>
<td>JSON.stringify() хак</td>
</tr>
<tr>
<td><strong>Производительность</strong></td>
<td>+10% overhead</td>
<td>Массивы быстрее на 30%</td>
</tr>
<tr>
<td><strong>Поддержка</strong></td>
<td>Нет в ES2026</td>
<td>Полная везде</td>
</tr>
</tbody>
</table>
<h2>Последствия для разработчиков</h2>
<p dir="auto">Отказ ударил по фанатам строгой типизации из TypeScript. Без записей приходится использовать plain objects или классы, что усложняет деструктуризацию. В проектах на React или Node.js это значит больше boilerplate. Например, вместо записи {name: ‘user’, id: 123} - обычный объект с проверками.</p>
<p dir="auto">ES2026 ввёл <strong>toSorted()</strong> для массивов и <strong>Set.prototype.union</strong> - они решают похожие задачи проще. Promise.try упрощает async-код без try-catch. Разработчики на фронте выиграют от RegExp.escape против инъекций. Но без кортежей API с фиксированными позициями остаются хрупкими - ошибка в порядке полей валит весь вызов.</p>
<ul>
<li><strong>Фронтенд</strong>: Вместо кортежей - […userData] с деструктуризацией; <strong>удобно</strong>, но не типобезопасно.</li>
<li><strong>Бекенд (Node.js)</strong>: Map.getOrInsertзаменяет записи для prefs; сокращает if-checks на 50% строк.</li>
<li><strong>Мобильная разработка</strong>: Float16Array в ES2026 лучше для графики, чем custom-кортежи.</li>
<li><strong>TypeScript</strong>: ts-tuples полифилл, но без нативки - overhead в бандле.</li>
</ul>
<h2>Альтернативы в ES2026 и полифиллы</h2>
<p dir="auto">TC39 выбрал прагматизм: <strong>Array.prototype.toReversed</strong>, <strong>toSorted</strong> копируют без мутации. Set операции (union, intersection) - как кортежи для уникальных данных. getOrInsert на Map - замена get/has/set в одном вызове. Это покрывает 80% use cases без новых типов.</p>
<p dir="auto">Полифиллы вроде records-and-tuples доступны на npm, но не рекомендуются для продакшена - они замедляют V8. Лучше Object.fromEntries() или structuredClone() для immutable копий. Впример: prefs.getOrInsert(‘darkmode’, true) вместо записи с дефолтами.</p>
<pre><code class="language-javascript">// Вместо записи
const userRecord = { id: 1, name: 'Alex' }; // plain object

// Кортеж -&gt; массив
const coords = [10, 20]; // с комментариями позиций
destructuring: const [x, y] = coords;
</code></pre>
<ul>
<li><strong>Встроенные методы</strong>: toSpliced(), Set.difference - иммутабельность без фич.</li>
<li><strong>Structured Clone</strong>: Копирует объекты глубоко, как записи.</li>
<li><strong>Temporal API</strong> (stage 3): Планы на 2027 как замена.</li>
</ul>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>Фича ES2026</th>
<th>Замена для</th>
<th>Преимущество</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Promise.try</strong></td>
<td>Async записи</td>
<td>Нет try-catch</td>
</tr>
<tr>
<td><strong>Set.union</strong></td>
<td>Кортежи уникальных</td>
<td>O(n) скорость</td>
</tr>
<tr>
<td><strong>RegExp.escape</strong></td>
<td>String записи</td>
<td>Безопасный парсинг</td>
</tr>
</tbody>
</table>
<h2>Взгляд на будущее JS без этих фич</h2>
<p dir="auto">ES2026 вышел без кортежей, но с фокусом на <strong>производительность</strong> - модули загружаются лениво. Это важнее экзотики для 99% кода. Разработчики адаптируются: библиотеки вроде Immer добавляют иммутабельность. Следующий год принесёт stage 4 для Signals или что-то похожее.</p>
<p dir="auto">Остаётся вопрос: вернутся ли они? TC39 мониторит фидбек - если V8 оптимизирует, шанс 70% на ES2028. А пока фокусируйтесь на новых методах массивов - они упростят рефакторинг legacy.</p>
]]></description><link>https://forum.exlends.ru/topic/892/otkaz-ot-kortezhej-i-zapisej-v-ecmascript-2026-prichiny-i-posledstviya</link><generator>RSS for Node</generator><lastBuildDate>Sat, 17 Oct 2026 03:58:49 GMT</lastBuildDate><atom:link href="https://forum.exlends.ru/topic/892.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 02 Mar 2026 05:03:37 GMT</pubDate><ttl>60</ttl></channel></rss>