我想知道为什么我们必须克隆对象而不是直接分配。
var obj1 = {x: 5, y:5};
var obj2 = obj1;
obj2.x = 6;
console.log(obj1.x); // logs 6
我已经得到了解决方案,但我想知道为什么obj2工作就像一个引用变量?
让我们一步一步地看看这段代码是怎么做的:
1 -
var obj1 = {x: 5, y:5};
创建对象{x: 5, y:5}
并将其引用存储在变量obj1
2 -
var obj2 = obj1;
创建变量obj2
,并将obj1
的值赋给该变量。由于obj1
的值是对一个对象的引用,那么obj2
现在将指向同一个对象。
3 -
obj2.x = 6;
修改被引用对象的属性x
的值
4 -
console.log(obj1.x); // logs 6
从obj1
引用的对象中打印x
属性。因为obj1
和obj2
都指向同一个位置,所以输出是6
。
这与任何使用对象引用的语言都具有相同的行为。Java, C, c++, c#等。在OOP语言中,通常有一个clone()
方法,它将逐个字段地进行复制。但是在JS的情况下,这样的方法不存在,您需要对每个元素进行深度复制。关于如何在JS中克隆元素,你可以在这里找到一组很好的答案:在JavaScript中深度克隆对象的最有效方法是什么?