Вебсправочник
Справочник JavaScript

Array.with(): замена одного элемента без мутации

Метод with создаёт массив с заменой элемента по индексу, оставляя исходную коллекцию без изменения. Отрицательный индекс отсчитывается с конца.

Назначение

Метод with создаёт массив с заменой элемента по индексу, оставляя исходную коллекцию без изменения. Отрицательный индекс отсчитывается с конца.

Как это работает

Операция подходит для локального обновления известной позиции. В отличие от обычного присваивания по индексу она возвращает новую ссылку на массив и не расширяет его за пределы допустимого диапазона.

Пример

const values=[10,20,30];
const changed=values.with(-1,99);
console.assert(changed.join(",")==="10,20,99");
console.assert(values[2]===30);
let rejected=false;
try{values.with(3,0);}catch(error){rejected=error instanceof RangeError;}
console.assert(rejected);

Что должно получиться

Индекс -1 заменяет последний элемент только в новой коллекции. Попытка обратиться к индексу 3 у массива длины 3 приводит к RangeError; дополнительное значение не добавляется.

Граница применения и частая ошибка

Индекс должен описывать существующую позицию. Для вставки используют другую операцию. Копирование поверхностное: при замене поля вложенного объекта понадобится отдельно создать его копию. В старых средах метод может отсутствовать.

Самостоятельная проверка

Обновите второй объект списка, передав в with новый объект со spread и изменённым полем. Проверьте одновременно новую ссылку массива и сохранение исходного объекта.

Пример JavaScript проверяйте в собственном учебном файле или консоли своего проекта. Встроенная песочница справочника JavaScript не выполняет. Успешное выполнение в одной среде не гарантирует поддержку метода во всех браузерах.

Самостоятельный учебный материал. Техническая документация: первоисточник по теме ↗. Если результат отличается, проверьте код и версию браузера.