Learn JavaScript

copyWithin() - метод для копирования части массива внутри него в JavaScript

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() - это метод для внутреннего копирования элементов массива. Он полезен, когда нужно перезаписать часть массива без изменения его длины, но важно помнить: метод работает прямо с исходным массивом.