我有返回其他对象的函数,并且需要此对象的某些克隆才能以某种方式对其进行操作。该对象具有数组属性,非常复杂,我希望它随心所欲,而不受任何数据类型的限制。
但是,当我这样做时,它成为两个对象的相同引用,并且相同的更改对两个对象都有影响。
在研究了这个问题之后,我发现如果从函数返回的对象在JS的全局范围内,那么它将是相同的引用,但是如果它在函数上是局部的,它将是新的。
例如,请参见代码。当我从 func1 分配它们时,x和y是相同的,但是当我使用 func2 时,它们分别是另一个。
我试图避免使用第3种工具对对象进行深层复制的需要,或者通过我自己的服务功能手动进行复制。
是否有解决此问题的简单方法,我很高兴知道该学习什么。
谢谢。
let obj1 = {
a:"Ay",
b: "Bi"
}
function func1(){
return obj1;
}
let x = func1 ();
let y = func1();
console.log(x , y);
x.a = "new value1 ";
console.log(x , y);
//both x & y changed
function func2(){
let obj2 = {
a:"Ay",
b: "Bi"
}
return obj2;
}
x = func2 ();
y = func2();
console.log(x , y);
x.a = "other value1 ";
console.log(x , y);
//only x have changed
答案 0 :(得分:1)
对象是通过Javascript引用传递的,您可以使用Spread Operator创建克隆
let obj1 = {
a:"Ay",
b: "Bi"
}
function func1() {
return {...obj1};
}
let x = func1 ();
let y = func1();
console.log(y);
x.a = "new value1 ";
console.log(x , y);
function func2(){
return {
a:"Ay",
b: "Bi"
}
}
x = func2 ();
y = func2();
console.log(x , y);
x.a = "other value1 ";
console.log(x , y);
还有其他创建对象副本的方法,请在下面查看以最快的速度进行检查 https://jsperf.com/deep-copy-vs-json-stringify-json-parse/5