我有方法getParameters()返回一个设置对象,该对象包含一个参数列表,我在内部实现了代码,并在显示新对象时在参数列表中添加了一些项目,当我显示新对象时,发现该列表具有添加的项目,但是问题是当我显示返回的对象时,我发现它也发生了改变
this.settingService.getParameters().subscribe((setting: Setting) => {
const settingToSave = setting;
this.parameters.forEach(element => {
if (settingToSave.parameters.some(parameter => parameter.parameterId === element.parameterId)) {
settingToSave.parameters = settingToSave.parameters.filter(parameter => parameter.parameterId != element.parameterId);
}
settingToSave.parameters.push(element);
});
console.log(settingToSave);
console.log(setting); // same content as the object settingToSave
}
答案 0 :(得分:1)
通过const settingToSave = setting
,您正在创建参考,而不是副本。因此,当您修改settingToSave
的属性时,与直接修改setting
时一样,您正在修改同一对象。
一个简单的示例,显示引用和副本之间的区别(在这种情况下,我正在使用JSON.parse(JSON.stringify(...))
创建副本,对于实际的实际项目,我不建议这样做):
const original = {"property":"value"};
const reference = original;
const copy = JSON.parse(JSON.stringify(original));
reference.property = "new value";
console.log(reference.property === original.property);
console.log(copy.property !== original.property);
有关替代方法,请参见How to Deep clone in javascript。
答案 1 :(得分:0)
在许多编程语言中,当您尝试通过执行A = B复制 object 变量时,您是通过引用而不是通过值来复制变量。因此,对A所做的任何更改都将应用于B,反之亦然。如果要复制对象变量并对其进行更改而又不影响其原始声明,请使用以下(ES6):
let newObj = Object.assign({},originalObj);
或在您的情况下替换以下行:
const settingToSave =设置; 与: 让settingToSave = Object.assign({},setting);
使用的来源:MDN Object assign