[英]javascript: modifying second variable modifies first
我试图了解一些JavaScript,发现了一些非常意外的行为。 我对这种语言不了解太多,所以我想找出这种行为的含义,以便我可以正式地了解它。
这是行为的示例:
var test={'x':2};
var test2=test;
test2.sourceLinks = [];
console.log('test',test);
console.log('test2',test2);
令我惊讶的是,我发现修改第二个变量也会以某种方式修改第一个。 变量“ test”还将具有一个属性.sourceLinks = []。 我是否了解正确的情况?如果是,此行为的正式术语是什么?
我发现如何正确克隆JavaScript对象? 在我发布它之后,尽管覆盖的范围超出了我的要求。
行为称为创建参考 。 当分配的变量实际上是一个对象时,它不会被复制,而是分配的结果是对该对象的新引用(指针)。
原始类型不会发生这种情况:
但是发生在所有对象类型上:
这种差异在javascript中意义重大。 当某个值应该传递给另一个作用域并且可以在此处进行修改时,应该将其传递给引用。
function main(){
var x = 1;
modify(x);
console.log(x);//x remains 1
}
function modify(arg){
arg = 10;
}
而当将其作为对象的字段传递时,可以通过引用对象来对其进行修改:
function main(){
var o = {x : 1};
modifyObj(o);
console.log(o);//o.x now equals 10
}
function modifyObj(arg){
arg.x = 10;
}
它持有参考 。
当您将对象/数组/函数分配给另一个对象/数组/函数时,它将分配引用而不是值。
为了克服这个问题,您必须克隆它
在Javascript中声明变量时,您正在内存中创建一个对象,作用域中的变量是指向该内存对象的指针。
在您的示例中,两个变量(test和test2)都指向同一对象。 因此,当您修改任一变量指针时,它就是在修改内存中的同一对象。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.