Array.prototype.copyWithin()
Базовый уровень Широко доступно
Эта возможность хорошо зарекомендовала себя и работает на многих устройствах и в различных версиях браузеров. Она доступна во всех браузерах с сентября 2016 года.
Метод copyWithin() экземпляров Array осуществляет поверхностное копирование части этого массива в другую область того же массива и возвращает этот массив без изменения его длины.
Попробовать
const array = ["a", "b", "c", "d", "e"]; // Copy to index 0 the element at index 3 console.log(array.copyWithin(0, 3, 4)); // Expected output: Array ["d", "b", "c", "d", "e"] // Copy to index 1 all elements from index 3 to the end console.log(array.copyWithin(1, 3)); // Expected output: Array ["d", "d", "e", "d", "e"]
Синтаксис
copyWithin(target, start) copyWithin(target, start, end)
Параметры
-
target - Индекс (начиная с 0), куда копируется последовательность, преобразованный в целое число. Это соответствует месту, куда будет скопирован элемент с
start, и все элементы междуstartиendкопируются в последующие индексы.- Отрицательный индекс отсчитывается с конца массива — если
-array.length <= target < 0, используетсяtarget + array.length. - Если
target < -array.length, используется0. - Если
target >= array.length, ничего не копируется. - Если
targetпосле нормализации позиционируется послеstart, копирование происходит только до концаarray.length(другими словами,copyWithin()никогда не расширяет массив).
- Отрицательный индекс отсчитывается с конца массива — если
-
start - Индекс (начиная с 0), откуда начинать копирование элементов, преобразованный в целое число.
- Отрицательный индекс отсчитывается с конца массива — если
-array.length <= start < 0, используетсяstart + array.length. - Если
start < -array.length, используется0. - Если
start >= array.length, ничего не копируется.
- Отрицательный индекс отсчитывается с конца массива — если
-
endНеобязательный - Индекс (начиная с 0), на котором заканчивать копирование элементов, преобразованный в целое число.
copyWithin()копирует до, но не включаяend.- Отрицательный индекс отсчитывается с конца массива — если
-array.length <= end < 0, используетсяend + array.length. - Если
end < -array.length, используется0. - Если
end >= array.lengthилиendопущен, илиundefined, используетсяarray.length, в результате чего копируются все элементы до конца. - Если
endподразумевает позицию до или в позиции, подразумеваемойstart, ничего не копируется.
- Отрицательный индекс отсчитывается с конца массива — если
Возвращаемое значение
Модифицированный массив.
Описание
Метод copyWithin() работает подобно memmove в C и C++ и является высокопроизводительным способом сдвига данных в Array. Это особенно применимо к одноимённому методу TypedArray. Последовательность копируется и вставляется за одну операцию; вставленная последовательность будет содержать скопированные значения, даже если области копирования и вставки перекрываются.
Поскольку undefined становится 0 при преобразовании в целое число, пропуск параметра start имеет тот же эффект, что и передача 0, которая копирует весь массив в целевую позицию, что эквивалентно сдвигу вправо, при котором правая граница обрезается, а левая дублируется. Такое поведение может сбить с толку читателей вашего кода, поэтому вам следует явно передавать 0 как start.
console.log([1, 2, 3, 4, 5].copyWithin(2)); // [1, 2, 1, 2, 3]; move all elements to the right by 2 positions
Метод copyWithin() является мутирующим методом (методом, изменяющим массив). Он не изменяет длину this, но изменяет содержимое this и при необходимости может создавать новые свойства или удалять существующие.
Метод copyWithin() сохраняет пустые слоты. Если область, из которой производится копирование, является разреженной, соответствующие новые индексы пустых слотов удаляются и также становятся пустыми слотами.
Метод copyWithin() является обобщённым (generic). Он ожидает, что значение this будет иметь свойство length и свойства с целочисленными ключами. Хотя строки также являются массивоподобными, этот метод не подходит для применения к ним, поскольку строки неизменяемы.
Примеры
Использование copyWithin()
console.log([1, 2, 3, 4, 5].copyWithin(0, 3)); // [4, 5, 3, 4, 5] console.log([1, 2, 3, 4, 5].copyWithin(0, 3, 4)); // [4, 2, 3, 4, 5] console.log([1, 2, 3, 4, 5].copyWithin(-2, -3, -1)); // [1, 2, 3, 3, 4]
Использование copyWithin() на разреженных массивах
copyWithin() будет распространять пустые слоты.
console.log([1, , 3].copyWithin(2, 1, 2)); // [1, empty, empty]
Вызов copyWithin() на объектах, не являющихся массивами
Метод copyWithin() считывает свойство length из this, а затем манипулирует задействованными целочисленными индексами.
const arrayLike = {
length: 5,
3: 1,
};
console.log(Array.prototype.copyWithin.call(arrayLike, 0, 3));
// { '0': 1, '3': 1, length: 5 }
console.log(Array.prototype.copyWithin.call(arrayLike, 3, 1));
// { '0': 1, length: 5 }
// The '3' property is deleted because the copied source is an empty slot
Спецификации
Совместимость с браузерами
| Десктопные | Мобильные | Серверные | |||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Chrome | Edge | Firefox | Opera | Safari | Chrome Android | Firefox for Android | Opera Android | Safari on iOS | Samsung Internet | WebView Android | WebView on iOS | Bun | Deno | Node.js | |
copyWithin |
45 |
12 |
32 |
32 |
9 |
45 |
32 |
32 |
9 |
5.0 |
45 |
9 |
1.0.0 |
1.0 |
4.0.0 |
Смотрите также
- Полифилл
Array.prototype.copyWithinвcore-js - Полифилл es-shims для
Array.prototype.copyWithin - Руководство по Индексированным коллекциям
ArrayTypedArray.prototype.copyWithin()
© 2005–2025 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/copyWithin