对象数组的Javascript深拷贝

问题描述 投票:-1回答:2

请考虑以下代码,

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的参考不应更改原始对象。有什么解释吗?

javascript deep-copy shallow-copy
2个回答
0
投票

spread运算符方法仅执行数组本身的深层副本,而不执行数组内部的对象。 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 )

0
投票

即使使用传播运算符,更改也会在同一参考上完成。因此,在您的json样本中没有日期对象,因此您可以使用此方法。如果有日期对象,则此方法将无效。

let c = JSON.parse(JSON.stringify(a));
c[0].b = {l:200}
console.log( a )
© www.soinside.com 2019 - 2024. All rights reserved.