【问题标题】:Splice method used on a copy of an array of objects在对象数组的副本上使用的拼接方法
【发布时间】:2021-07-14 11:52:13
【问题描述】:

我对扩展运算符如何处理对象数组有点困惑。假设我有一个对象数组,例如:

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

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

【问题讨论】:

  • 这就是为什么开发人员使用spread 操作符来进行浅拷贝
  • 当浅拷贝对象时(默认是赋值,或者像这里一样,传播引用数组),你总是只是复制引用。在这里,如果你做cloneArray[0].name = 'coolNewValue';,它也会反映在array中。

标签: javascript arrays splice


【解决方案1】:

您没有修改数组条目。

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

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

【讨论】:

    猜你喜欢
    • 2019-10-16
    • 2022-11-20
    • 2020-12-25
    • 2017-06-11
    • 1970-01-01
    • 2021-06-01
    • 2013-07-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多