2015-08-16 70 views
0

我想了解一些JavaScript,發現一些非常意外的行爲。我不太瞭解這種語言,所以我想知道這種行爲被稱爲什麼,以便我可以正式閱讀它。javascript:修改第二個變量首先修改

這裏是行爲的一個例子:

var test={'x':2}; 

var test2=test; 

test2.sourceLinks = []; 

console.log('test',test); 
console.log('test2',test2); 

令我驚訝,我發現,修改第二變量在某種程度上修改第一個爲好。變量「test」也會有一個屬性.sourceLinks = []。我是否理解正確的事情?如果是這樣,這種行爲的正式名稱是什麼?

我發現這個問題的答案在How do I correctly clone a JavaScript object?之後發佈了,儘管這個問題比我所問的要多。

+0

[克隆JavaScript對象的最優雅方式]的可能重複(http://stackoverflow.com/questions/728360/most-elegant-way-to-clone-a-javascript-object) – Paul

回答

2

它持有參考

當分配對象/陣列/功能到另一個對象/陣列/功能它會分配引用,而不是值。

爲了克服這一點,你必須克隆

+0

感謝您的回覆。所以,讓我知道這是一個重複的問題,但我會盡力證明你是第一個迴應的人。在我的情況下,複製行爲是所需的,所以不需要克隆。 – ouonomos

3

行爲稱爲創建參考。當變量賦值實際上不是被複制的,而是賦值的結果是一個新的對象引用(指針)。

這不符合基本類型發生:

  • 布爾
  • UNDEF列爲

但情況與所有對象類型:

  • 對象
  • 陣列
  • 功能

這個區別在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; 
} 
0

當聲明在Javascript變量要創建一個對象在內存和範圍中的變量是指向該內存對象的指針。

在你的例子中,兩個變量(test和test2)都指向同一個對象。因此,當你修改這兩個變量指針時,它正在修改內存中的同一個對象。