对象复制问题
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-objectp24 = 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,但在概念上它的工作原理相同。]
【讨论】:
以上是关于对象复制问题的主要内容,如果未能解决你的问题,请参考以下文章