通常對於我們開發者來說,有不少人是忽略了這些小問題的,但是我們又必要去了解.因為今天一個朋友問起,所以寫到這里來了,
在C#中,我們知道如果要往一個函數中傳遞參數的類型為對象,數組或者其他引用類型時.
實際上傳遞過去的是對象的地址.
那么在javascript中,是否會有什么差異呢?下面我們需要通過例子來證明.
var par1 = 1; //數字(值類型) var par2 = []; //數組(引用類型) var par3 = {}; //對象(引用類型) function Test(par1, par2, par3) { par1 = 3; par2 = [1, 2, 3]; par3 = {a:1}; } Test(par1, par2, par3); alert(par1);//輸出1 alert(par2);//輸出空白 alert(par3.a);//輸出undefined
上面這段代碼我們首先分別定義了值類型par1, 引用類型par2,par3,並傳入到Test函數中.
但是par2,par3輸出的仍然是之前的數據.
是不是說如果在調用函數時傳入引用類型,其實也是傳遞值呢? 其實不是的.
數組、對象等引用類型也是按值傳遞,但是這里的值是指變量地址的值
前面的例子中,當我們將par2,par3傳入函數的時候,其實就有了地址的副本,這些副本就和外面par2,par3的地址指向是一樣的.
但是我們為par2, par3賦了值, 改變了地址指向,於是地址就指向了新的對象和數組.這樣其實內部和外部的par2,par3就不是指向同一個地址的了.
為了證明這個問題,我們可以試着不賦值給他們,而是直接使用自身的對象.代碼如下:
var par1 = 1; //數字(值類型) var par2 = []; //數組(引用類型) var par3 = {}; //對象(引用類型) function Test(par1, par2, par3) { par1 = 3; par2.push(10);//操作自身對象 par3.a = 2; //操作自身對象 } Test(par1, par2, par3); alert(par1);//輸出1 alert(par2);//輸出10 alert(par3.a);//輸出2
事實證明了,當我們調用函數傳入值類型參數時,我們傳入的就是值,傳入引用類型的值時,我們傳入的,就是他們的地址.