Копирование массивов

( 1 ) С использованием метода slice()

var arr1 = [1, 2, 3]
var arr2 = arr1.slice();

console.log(arr1) // [1, 2, 3]
console.log(arr2) // [1, 2, 3]

console.log(arr1 == arr2) // false

Но при использование такого подхода возникает проблема "глубокого копирования". Например, если копируемый массив будет иметь ссылку на другой массив.

var arr1 = [1, 2, 3];
var arr2 = [arr1, 4, 5, 6];

var arr3 = arr2.slice();

console.log(arr2) // [[1, 2, 3], 4, 5, 6]
console.log(arr3) // [[1, 2, 3], 4, 5, 6]

arr1.push(10); // Добавляем значение

console.log(arr2) // [[1, 2, 3, 10], 4, 5, 6]
console.log(arr3) // [[1, 2, 3, 10], 4, 5, 6] - изменения затронули и копию!

( 2 ) JSON

Чтобы избежать ситуации выше, моэно воспользоваться объектом JSON и его методами .parse() и .stringify()

var arr1 = [1, 2, 3];
var arr2 = [arr1, 4, 5, 6];

var arr3 = JSON.parse(JSON.stringify(arr2))

console.log(arr2) // [[1, 2, 3], 4, 5, 6]
console.log(arr3) // [[1, 2, 3], 4, 5, 6]

arr1.push(10); // Добавляем значение    

console.log(arr2) // [[1, 2, 3, 10], 4, 5, 6]
console.log(arr3) // [[1, 2, 3], 4, 5, 6] - сама копия НЕ ИЗМЕНИЛАСЬ

<<< back

results matching ""

    No results matching ""