Array.copyWithin(): копирование диапазона внутри массива
CopyWithin переносит копии элементов из одного участка массива в другой, изменяя тот же массив. Длина не увеличивается, а содержимое целевого участка перезаписывается.
Назначение
CopyWithin переносит копии элементов из одного участка массива в другой, изменяя тот же массив. Длина не увеличивается, а содержимое целевого участка перезаписывается.
Как это работает
Аргументы идут в порядке target, start, end. Конечный индекс не включается, отрицательные индексы отсчитываются от конца. При перекрытии диапазонов копирование ведёт себя так, чтобы не испортить исходную последовательность внутри операции.
Пример
const values = ["a", "b", "c", "d", "e"];
const result = values.copyWithin(1, 3);
console.assert(result === values);
console.assert(values.join("") === "adede");
const overlap = [1, 2, 3, 4];
overlap.copyWithin(1, 0, 3);
console.assert(overlap.join(",") === "1,1,2,3");
console.assert(overlap.length === 4);
console.log(values, overlap);
Что должно получиться
Первый массив становится ["a", "d", "e", "d", "e"]. Во втором перекрывающиеся диапазоны дают [1, 1, 2, 3]. Возвращённое значение указывает на исходный изменённый массив.
Граница применения и частая ошибка
Метод не создаёт глубоких копий объектов: ссылки остаются ссылками. Его не следует путать со slice, который возвращает новый массив, или splice, который способен менять длину и удалять элементы.
Самостоятельная проверка
Нарисуйте пять ячеек и отметьте исходный и целевой диапазоны до запуска. Затем попробуйте отрицательный target и end, равный start. Проверьте, какие индексы действительно изменились, а какие сохранились.
Пример JavaScript проверяйте в собственном учебном файле или консоли своего проекта. Встроенная песочница справочника JavaScript не выполняет. Успешное выполнение в одной среде не гарантирует поддержку метода во всех браузерах.