2012-02-16 104 views
2

如果JavaScript對象的屬性通過引用爲什麼這不工作順利通過:JavaScript對象屬性作爲參數的

var myObj={a:1} 

function myFun(x){ 
x=2; 
} 

myFun(myObj.a); 

// value myObj.a is still 1 

但另一方面,如果你這樣做:

var myObj={a:1} 

function myFun(x){ 
x.a=2; 
} 

myFun(myObj); 

// this works myObj.a is 2 

回答

1

10原始值按值傳遞。對象通過引用傳遞。

對象屬性是通過基於它們的數據類型通過。

這裏要傳遞的整數 - x表示值1分配x值2不引用原始對象。

比方說,你在通過屬性是一個數組。我調用的第二個函數接收一個數組,並對該數組進行更改。然後,更改將持續到該對象,因爲該對象的屬性包含對您修改的數組的引用。你沒有技術上的修改對象在所有...你只是修改它的對象引用的數組。當你將一個對象屬性傳遞給一個函數時,它根本不知道它屬於一個對象。

參見例如,類似於你:

var myObj={a:[1]} 

function fn1(x){ 
x=2; //Overwrites x in this scope to the new primitive 2. 
     //This isn't reflected in myObj because x is not a 
     //reference to myObj.a it is a reference to the array 
     //that myObj.a contains (the [1]). 
} 

function fn2(x){ 
x.push(2); 
} 

fn1(myObj.a); //myObj.a is [1] 
fn2(myObj.a); //myObj.a is [1,2] 
2

你的第一個例子沒有按「T的工作,因爲對象性質通過引用傳遞(除非屬性本身也是一個對象)。

正如你注意到的,通過引用傳遞 - 這就是你的第二個例子工作的原因。

0

當您通過一個基本數據類型,它是由值來傳遞。這是整數,您可以通過值,因此它的副本在局部範圍內由傳遞參數。但是對象通過引用傳遞,所以函數可以訪問變量。你可以通過引用來傳遞它,但它更容易做

Obj.a=fun(Obj.a);