<?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[Новые иммутабельные методы массивов в JavaScript: toReversed, toSorted, toSpliced, with]]></title><description><![CDATA[<p dir="auto">JavaScript получает новые иммутабельные методы массивов - toReversed, toSorted, toSpliced и with. Они решают проблему мутации исходного массива, создавая копии без изменений оригинала. Это упрощает код в React, Vue и других фреймворках, где иммутабельность критична для перерисовок.</p>
<p dir="auto">Зачем это нужно? Старые методы вроде reverse, sort и splice меняют массив на месте, что приводит к багам в больших проектах. Новые аналоги возвращают свежий массив, оставляя оригинал нетронутым. Теперь можно писать чище и надежнее, без спредов и slice для обходных путей.</p>
<h2>Что такое иммутабельные методы и почему они важны</h2>
<p dir="auto">Иммутабельные методы не трогают исходный массив, а всегда возвращают новый. Это базовая идея: мутабельные методы вроде push, pop, sort изменяют данные на месте, что удобно для производительности, но опасно в многопоточных сценариях или при работе с состоянием. В JavaScript мутация приводит к неожиданным side-effect’ам - функция меняет данные за пределами своей видимости, и код ломается.</p>
<p dir="auto">Представьте массив в состоянии React-компонента. Если sort его поменяет, компонент перерисуется некорректно или вызовет бесконечный цикл. Новые методы решают это, создавая копию. Они появились в ECMAScript 2023-2025 и поддерживаются в современных браузерах. По данным Can I Use, охват - 95%+ устройств на март 2026.</p>
<p dir="auto">Вот ключевые отличия:</p>
<ul>
<li><strong>Мутабельные</strong>: reverse(), sort(), splice() - меняют оригинал.</li>
<li><strong>Иммутабельные новые</strong>: toReversed(), toSorted(), toSpliced(), with() - возвращают новый массив.</li>
<li><em>Нюанс</em>: with() меняет только один элемент по индексу, не трогая остальное.</li>
</ul>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>Метод</th>
<th>Мутабельный аналог</th>
<th>Что возвращает</th>
</tr>
</thead>
<tbody>
<tr>
<td>toReversed()</td>
<td>reverse()</td>
<td>Новый массив в обратном порядке</td>
</tr>
<tr>
<td>toSorted()</td>
<td>sort()</td>
<td>Отсортированная копия</td>
</tr>
<tr>
<td>toSpliced()</td>
<td>splice()</td>
<td>Массив без удаленных/вставленных элементов</td>
</tr>
<tr>
<td>with()</td>
<td>Нет прямого</td>
<td>Копия с измененным элементом по индексу</td>
</tr>
</tbody>
</table>
<h2>toReversed() - переверни без вреда</h2>
<p dir="auto">Метод toReversed() возвращает копию массива в обратном порядке, не меняя оригинал. Старый reverse() мутирует массив, что проблематично в цепочках методов или при сохранении исходных данных. С toReversed() код становится предсказуемым: arr.toReversed() всегда оставляет arr как есть.</p>
<p dir="auto">Пример: у нас массив чисел [1, 2, 3, 4]. Вызываем toReversed() - получаем [4, 3, 2, 1], оригинал не трогаем. Это полезно для UI-списков, где нужно показать обратный порядок без потери данных. В комбинации с map или filter цепочка остается чистой.</p>
<ul>
<li><code>const arr = [1, 2, 3]; const rev = arr.toReversed();</code> - rev: [3,2,1], arr: [1,2,3].</li>
<li>Полезно в <strong>React state</strong>: setState(arr.toReversed()) - без мутации.</li>
<li><em>Поддержка</em>: Chrome 110+, Firefox 115+, Safari 16.4+.</li>
<li>Сравни с […arr].reverse() - новый метод короче и быстрее.</li>
</ul>
<h2>toSorted() и toSpliced() - сортировка и правки без риска</h2>
<p dir="auto">toSorted() сортирует копию массива по заданному компаратору, оригинал остается прежним. Старый sort() меняет массив, что ломает логику в функциях. toSorted(compareFn) принимает функцию сравнения, как и sort.</p>
<p dir="auto">toSpliced(start, deleteCount, …items) удаляет/вставляет элементы, возвращая новый массив. Не путайте с splice() - здесь нет мутации. Идеально для редактирования списков в формах или TODO-приложениях.</p>
<p dir="auto">Примеры:</p>
<pre><code class="language-javascript">const nums = [3, 1, 4];
const sorted = nums.toSorted((a, b) =&gt; a - b); // [1,3,4], nums не изменился.

const fruits = ['banana', 'apple'];
const spliced = fruits.toSpliced(1, 0, 'orange'); // ['banana', 'orange', 'apple']
</code></pre>
<ul>
<li><strong>Преимущество</strong>: Чистые цепочки - arr.toSorted().map().filter().</li>
<li><em>Нюанс</em>: toSorted() стабильна - равные элементы сохраняют порядок.</li>
<li>Для строк: toSorted((a,b)=&gt;a.localeCompare(b)).</li>
</ul>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>Сценарий</th>
<th>Старый способ</th>
<th>Новый способ</th>
</tr>
</thead>
<tbody>
<tr>
<td>Сортировка</td>
<td>[…arr].sort()</td>
<td>arr.toSorted()</td>
</tr>
<tr>
<td>Удаление</td>
<td>arr.slice(0,start) + arr.slice(end)</td>
<td>arr.toSpliced(start, count)</td>
</tr>
</tbody>
</table>
<h2>with() - точечная замена элемента</h2>
<p dir="auto">Метод with(index, value) создает копию массива, заменяя элемент по индексу на новый. Нет мутации, оригинал цел. Это как spread с заменой: […arr.slice(0,index), value, …arr.slice(index+1)], но короче.</p>
<p dir="auto">Полезно для обновления состояния: в Redux или Zustand one-liner меняет один item. Поддерживает глубокие замены в пределах лимита.</p>
<pre><code class="language-javascript">const scores = [10, 20, 30];
const updated = scores.with(1, 25); // [10, 25, 30]
</code></pre>
<ul>
<li>Работает с <strong>примитивs и объектами</strong> - заменяет ссылку.</li>
<li><em>Ограничение</em>: Только один индекс за раз.</li>
<li>Идеально для массивов фиксированной длины.</li>
</ul>
<h2>Когда использовать иммутабельные методы на практике</h2>
<p dir="auto">Эти методы упрощают иммутабельный код в проектах. В старых браузерах используйте полифиллы из core-js. Они быстрее спредов на больших массивах - производительность на уровне C++.</p>
<p dir="auto">Останавливайтесь на простых случаях: для сложных мутаций комбинируйте с Immer или Immer.js. Стоит протестировать в devtools - console.table сравнит оригинал и копию. Дальше ждем flatMap() и другие новинки ES2026.</p>
]]></description><link>https://forum.exlends.ru/topic/1154/novye-immutabelnye-metody-massivov-v-javascript-toreversed-tosorted-tospliced-with</link><generator>RSS for Node</generator><lastBuildDate>Sat, 17 Oct 2026 03:40:10 GMT</lastBuildDate><atom:link href="https://forum.exlends.ru/topic/1154.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 05 Mar 2026 13:09:27 GMT</pubDate><ttl>60</ttl></channel></rss>