1. 程式人生 > 其它 >JavaScript:函式:函式傳參傳的是什麼?值傳遞還是引用傳遞?

JavaScript:函式:函式傳參傳的是什麼?值傳遞還是引用傳遞?

我們呼叫函式的時候,把實參放入到括號裡進行傳參,讓形參接收實參的資料。

在這個過程中,形參接收的資料到底是什麼,換句話說,我們傳參傳的到底是什麼東西?

初學JS的,可能不太難理解這個問題的意義是什麼?但是對於學過C/C++/Java的人來說,這個問題,其實就是在問,這個傳參到底是值傳遞,還是引用傳遞。

首先,我們先理解值傳遞和引用傳遞的概念,這需要結合記憶體結構去理解:

我們知道,實參(即變數),它所儲存的,是一個記憶體地址,而記憶體地所代表的這塊記憶體,儲存了一個數據;

看下面這個圖:

變數b,所儲存的是hello的記憶體地址,記憶體地址代表的那一塊記憶體,儲存了資料即字串hello;

  • 值傳遞

    值,即這個資料。

    所謂值傳遞,就是傳遞這個資料的一份copy。

    我們對copy做任何操作,都不會影響到原始值。

  • 引用傳遞

    引用,即這個記憶體地址。

    所謂引用傳遞,就是傳遞這個記憶體地址。

    我們對記憶體地址做任何操作,實質上就是在對記憶體地址所代表的這塊記憶體做操作,所以會影響到這塊記憶體所儲存的資料本身。

用兩段程式碼來驗證一下,JS的傳參,到底傳的是什麼:

這裡還要理解一個東西,即我們在檢視或者說輸出變數時,我們輸出的是什麼?肯定輸出的是,變數所指向的那塊記憶體儲存的資料。

第一段程式碼,我們實參是基本資料型別,呼叫函式前後,實參輸出結果沒變,即實參指向的那塊記憶體儲存的資料沒變;

第二段程式碼,我們實參是物件,呼叫函式前後,實參輸出結果改變了,即實參指向的那塊記憶體儲存的資料被函式改變了;

所以,我們可以得出結論,傳參的時候:

  • 傳基本資料型別時,是值傳遞;
  • 傳物件時,是引用傳遞;