请考虑以下代码,
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
的参考不应更改原始对象。有什么解释吗?
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 )
即使使用传播运算符,更改也会在同一参考上完成。因此,在您的json样本中没有日期对象,因此您可以使用此方法。如果有日期对象,则此方法将无效。
let c = JSON.parse(JSON.stringify(a));
c[0].b = {l:200}
console.log( a )