Кратко
Скопированоcopy
копирует последовательную часть элементов массива из одного места в другое. Длина массива при этом не меняется. Метод использует поверхностное копирование (shallow copy) элементов.
Пример
СкопированоСкопируем два последних элемента в начало массива:
const workDays = ['ПН', 'ВТ', 'СР', 'ЧТ', 'ПТ']console.log(workDays.copyWithin(0, 3))// ['ЧТ', 'ПТ', 'СР', 'ЧТ', 'ПТ']
const workDays = ['ПН', 'ВТ', 'СР', 'ЧТ', 'ПТ'] console.log(workDays.copyWithin(0, 3)) // ['ЧТ', 'ПТ', 'СР', 'ЧТ', 'ПТ']
Скопируем два первых элемента в конец массива:
const workDays = ['ПН', 'ВТ', 'СР', 'ЧТ', 'ПТ']console.log(workDays.copyWithin(-2, 0))// ['ПН', 'ВТ', 'СР', ПН', 'ВТ']
const workDays = ['ПН', 'ВТ', 'СР', 'ЧТ', 'ПТ'] console.log(workDays.copyWithin(-2, 0)) // ['ПН', 'ВТ', 'СР', ПН', 'ВТ']
Как пишется
СкопированоArray
принимает три аргумента:
- индекс элемента, определяющий позицию вставки скопированных значений;
- индекс элемента, определяющий позицию начала диапазона копируемых значений;
- необязательный параметр, определяющий индекс элемента, перед которым заканчивается диапазон копируемых значений.
Array
возвращает изменённый массив.
Метод copy
является изменяющим методом. После выполнения метода изменится сам массив, на котором он был вызван.
Если индекс конца диапазона копирования не указан, будут скопированы элементы до конца массива.
Отрицательные индексы используются для отсчёта от последнего элемента массива.
Если индексы не соответствуют размеру массива, никаких изменений не произойдёт.
Как понять
СкопированоМетод copy
может применяться как производительный способ перемещения диапазона значений из одной позиции массива в другую.
При выполнении копирования незаполненные ячейки будут также скопированы. Например, скопируем два первых элемента и вставим их на место двух последних:
const companies = ['HP']companies[2] = 'IBM'companies[4] = 'Intel'console.log(companies)// ['HP', <1 empty item>, 'IBM', <1 empty item>, 'Intel']console.log(companies.copyWithin(3, 0))// ['HP', <1 empty item>, 'IBM', 'HP', <1 empty item>]
const companies = ['HP'] companies[2] = 'IBM' companies[4] = 'Intel' console.log(companies) // ['HP', <1 empty item>, 'IBM', <1 empty item>, 'Intel'] console.log(companies.copyWithin(3, 0)) // ['HP', <1 empty item>, 'IBM', 'HP', <1 empty item>]
Подсказки
Скопировано💡 Метод производит преобразования к целому для аргументов, определяющих индексы. Это позволяет избежать случайных ошибок, однако приводит к некоторым неочевидным особенностям выполнения. Например, вызов copy
без указания второго аргумента не вызовет ошибок, так как в данном случае произойдёт преобразование undefined
в 0
, что соответствует начальному индексу в массиве. Для улучшения читаемости кода следует явно указывать параметр, определяющий позицию начала диапазона копируемых значений:
const colors = ['red', 'green', 'blue', 'white']// Работаетconsole.log(colors.copyWithin(2))// ['red', 'green', 'red', 'green']// То же самое, но понятнееconsole.log(colors.copyWithin(2, 0))// ['red', 'green', 'red', 'green']
const colors = ['red', 'green', 'blue', 'white'] // Работает console.log(colors.copyWithin(2)) // ['red', 'green', 'red', 'green'] // То же самое, но понятнее console.log(colors.copyWithin(2, 0)) // ['red', 'green', 'red', 'green']
💡 Если копируемые элементы массива являются объектами, то в результате работы метода copy
скопированные элементы на новых позициях будут содержать ссылки, а не новые объекты. Изменения этих объектов будут видны на старых и новых позициях:
const months = [['март', 'апрель'], 'июнь', 'июль', ['сентябрь']]// Скопируем последний элемент в начало массиваmonths.copyWithin(0, -1)console.log(months)// [['сентябрь'], 'июнь', 'июль', ['сентябрь']]// Изменим значение скопированного элементаmonths[0][0] = 'май'// Увидим изменения в источнике копированияconsole.log(months)// [['май'], 'июнь', 'июль', ['май']]
const months = [['март', 'апрель'], 'июнь', 'июль', ['сентябрь']] // Скопируем последний элемент в начало массива months.copyWithin(0, -1) console.log(months) // [['сентябрь'], 'июнь', 'июль', ['сентябрь']] // Изменим значение скопированного элемента months[0][0] = 'май' // Увидим изменения в источнике копирования console.log(months) // [['май'], 'июнь', 'июль', ['май']]