繁体   English   中英

javascript:修改第二个变量首先修改

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM