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 не выполняет. Успешное выполнение в одной среде не гарантирует поддержку метода во всех браузерах.