如何从函数返回新对象而不进行深层复制

时间:2019-03-25 10:14:33

标签: javascript ecmascript-6

我有返回其他对象的函数,并且需要此对象的某些克隆才能以某种方式对其进行操作。该对象具有数组属性,非常复杂,我希望它随心所欲,而不受任何数据类型的限制。

但是,当我这样做时,它成为两个对象的相同引用,并且相同的更改对两个对象都有影响。

在研究了这个问题之后,我发现如果从函数返回的对象在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

1 个答案:

答案 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