copyWithin() копирует часть массива в другую позицию внутри этого же массива.
Это не самый популярный метод, но его полезно знать, потому что он меняет массив “на месте” и работает не так, как обычное копирование.
Синтаксис
array.copyWithin(target)
array.copyWithin(target, start)
array.copyWithin(target, start, end)
target - позиция, куда нужно начать копирование.
start - индекс, с которого брать элементы.
end - индекс, до которого брать элементы, но сам end в копирование не входит.
Что делает copyWithin()
Метод берёт часть элементов и записывает их в другую часть того же массива.
const numbers = [1, 2, 3, 4, 5];
numbers.copyWithin(0, 3);
console.log(numbers); // [4, 5, 3, 4, 5]
Здесь элементы начиная с индекса 3 были скопированы в начало массива.
Длина массива не меняется
copyWithin() не добавляет новые элементы и не удаляет старые.
Он просто перезаписывает существующие позиции.
const numbers = [1, 2, 3, 4];
numbers.copyWithin(1, 2);
console.log(numbers); // [1, 3, 4, 4]
console.log(numbers.length); // 4
Что возвращает copyWithin()
Метод возвращает сам изменённый массив.
const numbers = [1, 2, 3, 4];
const result = numbers.copyWithin(0, 2);
console.log(result); // [3, 4, 3, 4]
console.log(numbers); // [3, 4, 3, 4]
Но важно помнить, что это тот же самый массив, а не новая копия.
Как работают target, start и end
target говорит, куда вставлять значения.
start говорит, откуда их брать.
end ограничивает конец диапазона.
const letters = ["a", "b", "c", "d", "e"];
letters.copyWithin(1, 3, 5);
console.log(letters); // ["a", "d", "e", "d", "e"]
Здесь из диапазона с индексами 3 и 4 были взяты "d" и "e" и записаны начиная с индекса 1.
Если end не указать
Если end не передать, копирование идёт до конца массива.
const numbers = [1, 2, 3, 4, 5];
numbers.copyWithin(2, 0);
console.log(numbers); // [1, 2, 1, 2, 3]
Отрицательные индексы
copyWithin() поддерживает отрицательные индексы.
В этом случае отсчёт идёт с конца массива.
const numbers = [1, 2, 3, 4, 5];
numbers.copyWithin(-2, 0, 2);
console.log(numbers); // [1, 2, 3, 1, 2]
Это значит, что копирование началось с позиции -2, то есть с индекса 3.
Перекрытие диапазонов
Даже если диапазон источника и место назначения пересекаются, метод всё равно работает корректно.
const numbers = [1, 2, 3, 4, 5];
numbers.copyWithin(1, 0, 3);
console.log(numbers); // [1, 1, 2, 3, 5]
Для новичков это место часто выглядит неожиданно, но поведение у метода стандартное.
copyWithin() меняет исходный массив
После вызова copyWithin() массив уже становится другим:
const items = ["a", "b", "c", "d"];
items.copyWithin(2, 0, 2);
console.log(items); // ["a", "b", "a", "b"]
Если нужен новый массив без изменения старого, этот метод обычно не подходит.
Поверхностное копирование
copyWithin() не делает глубокую копию объектов.
Если в массиве лежат объекты, будут копироваться ссылки на них.
const users = [{ name: "Anna" }, { name: "Ivan" }, { name: "Oleg" }];
users.copyWithin(1, 0, 1);
console.log(users);
// [{ name: "Anna" }, { name: "Anna" }, { name: "Oleg" }]
Когда это полезно
copyWithin() удобно использовать, когда:
- нужно быстро перезаписать часть массива значениями из другой его части
- важно сохранить ту же длину массива
- изменение исходного массива допустимо
В обычном прикладном коде метод встречается не слишком часто, но в справочнике его полезно знать.
Частые ошибки
Думать, что метод создаёт новый массив
const numbers = [1, 2, 3];
const result = numbers.copyWithin(1, 0);
console.log(result === numbers); // true
copyWithin() возвращает тот же самый массив, только уже изменённый.
Ждать, что длина массива увеличится
const numbers = [1, 2, 3, 4];
numbers.copyWithin(2, 0, 2);
console.log(numbers.length); // 4
Метод ничего не добавляет, а просто перезаписывает элементы.
Путать с slice() или splice()
const numbers = [1, 2, 3, 4];
numbers.copyWithin(0, 2);
Этот код не вырезает и не вставляет элементы как splice(), и не создаёт новый массив как slice().
Быстрая памятка
copyWithin()копирует часть массива в другое место этого же массива- метод меняет исходный массив
- длина массива не меняется
endне включается в копируемый диапазонcopyWithin()возвращает сам изменённый массив
Коротко
copyWithin() - это метод для внутреннего копирования элементов массива. Он полезен, когда нужно перезаписать часть массива без изменения его длины, но важно помнить: метод работает прямо с исходным массивом.