用于对象数组副本的拼接方法
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';
然后您会在源数组和克隆数组中看到变化。
我对展开运算符在对象数组上的工作方式有点困惑。假设我有一个对象数组,例如:
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';
然后您会在源数组和克隆数组中看到变化。