对象复制问题

Posted

技术标签:

【中文标题】对象复制问题【英文标题】:Object copying issue 【发布时间】:2019-07-04 00:18:20 【问题描述】:

我将 obj1 复制到 obj2,但是当我在 obj2 中进行更改时,对象 obj1 的值也在发生变化。如何阻止这种情况?

  let p24:   ProductModule=new ProductModule();
                              p24=  this.productlist[g];
                              p24.variants=[];
                              p24.variants.push(p.variants[h]);
                                  this.newproductlist.push(p24);

这里this.productlist[g] 是一个数组但是当我执行p24.variants=[]; this.productlist[g] 中的操作值也变为空

【问题讨论】:

***.com/questions/28150967/typescript-cloning-object p24 = this.productlist[g];**不**创建副本,上一行的new ProductModule();根本没有被使用。 【参考方案1】:

javascript 中有多种方法可以克隆对象。

最简单的方法(深度克隆/复制);

p24=  JSON.parse(JSON.stringify(this.productlist[g]));

注意:这样做可能会丢失 Object 的原始类型。

或者您也可以查看 JGFMK 建议的 Object.assign 、 Object.create 和 spread(...object) 运算符

【讨论】:

如果浅拷贝足够,则使用扩展运算符。 let copy = ...original ;【参考方案2】:

当您将 javascript oject 分配给另一个对象时,两者都将指向相同的内存位置。这就是如果你更新一个对象的原因,同样会更新另一个。为了避免这种情况

选项 1:

p24 =  JSON.parse(JSON.stringify(this.productlist[g]));

选项 2:

p24 =   ...this.productlist[g];

【讨论】:

“ProductModule”类型上不存在属性“切片”.ts(2339) 更新了答案【参考方案3】:

数字是值类型,对象是引用类型:

因此,将一个对象变量分配给另一个对象变量会导致它们都引用(指向)同一个对象。

您需要复制实例,而不是使用其他答案中显示的技术之一。

[注意:显示的此语法使用 C# 而不是 TypeScript,但在概念上它的工作原理相同。]

【讨论】:

以上是关于对象复制问题的主要内容,如果未能解决你的问题,请参考以下文章

何时复制 C# 值/对象,何时复制其引用?

如何轻松复制/复制现有领域对象

clone中的浅复制和深复制

深复制与浅复制

如何复制 IMFSample 对象

具有虚拟导航属性的深度复制/复制对象