2010-12-16 25 views
1

我正在嘗試將對象作爲函數參數(作爲引用而不是值)傳遞給對象,並且發現了一些對我來說似乎很奇怪的東西,我想知道爲什麼這是這樣工作。Javascript:引用對象參數,理解賦值差異

好吧,讓我們說我有兩個所謂的onload,以及版本之間有一個微小的變化JavaScript程序...

第一個程序的修改函數賦值參數爲這樣: data.fruit = "Mango";

//This program *will* update the data.fruit in the scope of main() with "Mango". 
function modify(data) { 
    data.fruit = "Mango"; 
    alert(data.fruit+"\nmodify();"); 
} 

function main(){ 
    var data= {"fruit":"Apple"}; 
    modify(data); 

    alert(data.fruit+"\nmain();"); 
} 

main(); 

第二個程序的修改函數重新指定參數對象的值,如下所示: data = {"fruit" : "Mango"};

//This program *ignores* updating the object in the scope of main. 
function modify(data) { 
    data = {"fruit" : "Mango"}; 
    alert(data.fruit+"\nmodify();"); 
} 

function main(){ 
    var data= {"fruit":"Apple"}; 
    modify(data); 

    alert(data.fruit+"\nmain();"); 
} 

main(); 

也許我誤解了通過引用傳遞,但是如果我分配一個對象的值,在我看來,分配對象的新對象的值應該保持引用。有人可以向我解釋這種行爲嗎?爲什麼在分配這種方式時引用丟失了?

+0

可能的重複[爲什麼此Javascript示例複製變量值而不是通過引用?](http://stackoverflow.com/questions/ 4440872/why-this-this-javascript-example-copy-the-variable-value-instead-of-pass-by-refer) – Gareth 2010-12-16 16:31:53

+0

問題的原因是一樣的。 – Incognito 2010-12-16 17:43:29

回答

3

該問題之前已經被問到(請參閱我的評論),但是「參考」在這個意義上與C++參考不同,後者不可重新分配。

將新值賦給變量* re *引用該變量,而不是更改之前引用的對象。

另一方面,在上執行操作,變量確實會影響引用的對象。它只是賦值運算符(及其變體+=等),它重新分配變量