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

Splice method used on a copy of an array of objects

我对展开运算符在对象数组上的工作方式有点困惑。假设我有一个对象数组,例如:

const array = [
{ name: 'Object 1', body: '123'},
{ name: 'Object 2', body: '456'}];

如果我制作一个克隆并在克隆上使用拼接:

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'}];

只修改了克隆的数组。扩展运算符不应该对初始数组进行浅拷贝,并强制我对所有对象进行深度克隆? 我在这里错过了什么?

您没有修改数组条目。

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

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';

然后您会在源数组和克隆数组中看到变化。