JavaScript 函數參數是傳值(byVal)還是傳址(byRef)?

來源:互聯網
上載者:User

對於“JavaScript 函數參數是傳值(byVal)還是傳址(byRef)”這個問題,普遍存在一個誤區:number,string等“簡單類型”是傳值,Number, String, Object, Array等“複雜類型”是傳址。
這樣不對嗎?為什麼會有這樣的誤區?看一下這兩段代碼:

//造成傳值假象的代碼function modifyLikeByVal(x){  x = 1;  console.log('x = %d', x);}var x = 0;console.log('x = %d', x); // 輸出 x = 0modifyLikeByVal(x);  // 輸出 x = 1console.log('x = %d', x); // 輸出 x = 0   x沒變!

 

//造成傳址假象的代碼function modifyLikeByRef(x){  x[0] = 4;  x[1] = 5;  x[2] = 6;  console.log('x = [ %s ]', x.join(', '));}var x = [1, 2, 3];console.log('x = [ %s ]', x.join(', ')); // 輸出 x = [ 1, 2, 3 ]modifyLikeByRef(x);  // 輸出 x = [ 4, 5, 6 ]console.log('x = [ %s ]', x.join(', ')); // 輸出 x = [ 4, 5, 6 ]   x變了!

 

於是,由以上代碼得出結論,“簡單類型”作為參數是傳值(byVal)的,“複雜類型”作為參數是傳址(byRef)的。

問題出在哪呢?

仔細觀察兩個函數,就可以發現一點:
在byVal中,是直接修改了參數x: x = 1;
而byRef中,是修改參數x的成員: x[0] = 4; x[1] = 5; x[2] = 6;

本人由此得出猜想:在JavaScript中,所有的變數或成員,都是一個指標,在修改變數或成員值的時候,其實是修改了該指標的地址

這樣上面的代碼就可以得到解釋了:

在“byVal”中:

global {  // 表示全域範圍,下面的表示函數範圍  var x = 0;  // 初始化指標x並指向數字0    fun(x) {      x = global.x; // 傳入參數global.x; fun域的x指標地址與global域的x指標地址一樣指向數字0      x = 1; // 修改fun域的x指標地址,指向數字1;    } // fun 域結束,global域中的x指標沒改變}

在“byRef”中:

global {  // 表示全域範圍,下面的表示函數範圍  /*    初始化指標x並指向數組[1, 2, 3]    其實是x的三個成員0, 1, 2,分別指向1, 2, 3;  */  var x = [1, 2, 3];      fun(x) {      x = global.x; // 傳入參數global.x; fun域的x指標地址與global域的x指標地址一樣指向數組[1, 2, 3]      /*       在fun域中的x沒有再被改變       緊接著修改fun域中的x(也就是global.x)三個成員指標的指向      */      x[0] = 4;      x[1] = 5;      x[2] = 6;    } // fun 域結束,global域中的x指標沒改變,但其三個成員指標被改變了,於是就看到我們輸出的結果}

 

那這段代碼怎麼解釋呢???

(function(a, b){    arguments[0] = 1;    b = 2;    console.log(arguments, a, b);})(-1, -2);

只能說a, b...,是arguments[0],...[n]的別名了。

如果有不對的地方,請指出來,謝謝。

如果有更好的解釋,歡迎大家分享。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.