javascript函數傳值問題(傳值?址)


通常對於我們開發者來說,有不少人是忽略了這些小問題的,但是我們又必要去了解.因為今天一個朋友問起,所以寫到這里來了,

在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

事實證明了,當我們調用函數傳入值類型參數時,我們傳入的就是值,傳入引用類型的值時,我們傳入的,就是他們的地址.

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM