Создание копии массива

Следует учитывать, что операция присваивания сохраняет в переменной ссылку на массив, а не все его значения. Например, если попробовать сделать так, то изменение arr2 затронет arr1:

let arr1, arr2;
arr1 = [1, 2, 3, 4];
arr2 = arr1;          // Присваивается ссылка на массив!!!
arr2[0] = 88;
console.log(arr1);    // [ 88, 2, 3, 4 ]
console.log(arr2);    // [ 88, 2, 3, 4 ]

Чтобы сделать копию массива, можно, например, воспользоваться методом slice() (см. разд. 6.11), который возвращает срез массива:

let arr1, arr2;
arr1 = [1, 2, 3, 4];
arr2 = arr1.slice(0);
arr2[0] = 88;
console.log(arr1);    // [ 1, 2, 3, 4 ]
console.log(arr2);    // [ 88, 2, 3, 4 ]

Необходимо заметить, что при использовании многомерных массивов метод slice() создает "поверхностную" копию, а не полную:

let arr1, arr2;
arr1 = [ [0, 1], 2, 3, 4 ];
arr2 = arr1.slice(0);
arr2[0][0] = 55;
arr2[1] = 88;
console.log(arr1[0]);  // [ 55, 1 ]
console.log(arr2[0]);  // [ 55, 1 ]
console.log(arr1[1]);  // 2
console.log(arr2[1]);  // 88

Как видно из примера, изменение вложенного массива в arr2 привело к одновременному изменению значения в arr1. Иными словами, оба массива содержат ссылку на один и тот же вложенный массив.

Для создания "поверхностной" копии массива можно также воспользоваться статическим методом from() из класса Array:

let arr1 = [1, 2, 3, 4], arr2;
arr2 = Array.from(arr1);
arr2[0] = 88;
console.log(arr1);    // [ 1, 2, 3, 4 ]
console.log(arr2);    // [ 88, 2, 3, 4 ]

А также оператором SPREAD:

let arr1 = [1, 2, 3, 4], arr2;
arr2 = [...arr1];
arr2[0] = 88;
console.log(arr1);    // [ 1, 2, 3, 4 ]
console.log(arr2);    // [ 88, 2, 3, 4 ]

Учебник по Node.js и JavaScript
Учебник по JavaScript (Node.js) в формате PDF

Помощь сайту

ЮMoney (Yandex-деньги): 410011140483022

ПАО Сбербанк:
Счет: 40817810855006152256
Реквизиты банка:
Наименование: СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК
Корреспондентский счет: 30101810500000000653
БИК: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНХ: 96130
Скриншот реквизитов