Javascript 用于对象数组副本的拼接方法

Javascript 用于对象数组副本的拼接方法,javascript,arrays,splice,Javascript,Arrays,Splice,我对spread操作符如何处理对象数组有点困惑。假设我有一个对象数组,比如: const array = [ { name: 'Object 1', body: '123'}, { name: 'Object 2', body: '456'}]; 如果我制作了一个克隆并在克隆上使用了splice: const cloneArray = [...array]; const newObject = { name: 'Object 3', body: '789'} cloneArray.splice

我对spread操作符如何处理对象数组有点困惑。假设我有一个对象数组,比如:

const array = [
{ name: 'Object 1', body: '123'},
{ name: 'Object 2', body: '456'}];
如果我制作了一个克隆并在克隆上使用了splice:

const cloneArray = [...array];
const newObject = { name: 'Object 3', body: '789'}
cloneArray.splice(1,1,newObject);
我将:

 const array = [
{ name: 'Object 1', body: '123'},
{ name: 'Object 2', body: '456'}];
 const cloneArray = [
{ name: 'Object 1', body: '123'},
{ name: 'Object 3', body: '789'}];
仅修改克隆的阵列。spread操作符不应该对初始数组进行浅拷贝,并强制我深度克隆所有对象? 这里缺少什么?

您没有修改数组项

替换数组项。将这些对象视为指向一段内存的指针:

const array = [A, B];
const cloneArray = [...array];
//    ^ cloneArray = [A, B]

const newObject = C;
cloneArray.splice(1,1,newObject);
//    ^ cloneArray = [A, C]
现在,如果要更改
A
的内容:

array[0].foo = 'Bar';
// Or
cloneArray[0].foo = 'Bar';

然后,您将在源数组和克隆中看到更改。

这就是为什么开发人员使用
spread
操作符进行浅拷贝当浅拷贝对象时(默认情况下,是带有赋值的对象,或者像这里一样,扩展引用数组),您总是只拷贝引用。在这里,如果您执行
cloneArray[0]。名称='coolNewValue'
,它也将反映在
数组中。