Javascript расширенная запись и глубокая копия массива объяснения объекта - PullRequest
0 голосов
/ 16 апреля 2020

Рассмотрим следующий код,

let a =[{b:{c:100}}]
let c = [...a]
c[0].b = {l:200}
console.log( a )

Вывод:

Array [Object { b: Object { l: 200 } }]

Учитывая, что c[0] является новым объектом, а c[0].b является ссылкой. Изменение ссылки b не должно изменять исходный объект. Есть ли объяснение этому?

Ответы [ 2 ]

0 голосов
/ 16 апреля 2020

, даже если вы используете оператор спреда, изменения выполняются по одной и той же ссылке. Таким образом, в вашем json образце нет объектов даты, поэтому вы можете использовать этот подход. если есть объект даты, этот подход не будет работать.

let c = JSON.parse(JSON.stringify(a));
c[0].b = {l:200}
console.log( a )
0 голосов
/ 16 апреля 2020

Метод оператора распространения выполняет только глубокое копирование самого массива, а не объектов внутри него. Объекты в c являются только ссылочными и в действительности указывают на объекты в a.

Наиболее надежным способом остается использование JSON.stringify, а затем JSON.parse. Уловка в том, что произойдет потеря некоторых данных, если у вас есть специальные типы в массиве.

function clone(arr) {
  return JSON.parse(JSON.stringify(arr));
}

let a =[{b:{c:100}}]
let c = clone(a);
c[0].b = {l:200}
console.log( a )
...