JavaScript:函式:函式傳參傳的是什麼?值傳遞還是引用傳遞?
阿新 • • 發佈:2022-12-09
我們呼叫函式的時候,把實參放入到括號裡進行傳參,讓形參接收實參的資料。
在這個過程中,形參接收的資料到底是什麼,換句話說,我們傳參傳的到底是什麼東西?
初學JS的,可能不太難理解這個問題的意義是什麼?但是對於學過C/C++/Java的人來說,這個問題,其實就是在問,這個傳參到底是值傳遞,還是引用傳遞。
首先,我們先理解值傳遞和引用傳遞的概念,這需要結合記憶體結構去理解:
我們知道,實參(即變數),它所儲存的,是一個記憶體地址,而記憶體地所代表的這塊記憶體,儲存了一個數據;
看下面這個圖:
變數b,所儲存的是hello的記憶體地址,記憶體地址代表的那一塊記憶體,儲存了資料即字串hello;
-
值傳遞
值,即這個資料。
所謂值傳遞,就是傳遞這個資料的一份copy。
我們對copy做任何操作,都不會影響到原始值。
-
引用傳遞
引用,即這個記憶體地址。
所謂引用傳遞,就是傳遞這個記憶體地址。
我們對記憶體地址做任何操作,實質上就是在對記憶體地址所代表的這塊記憶體做操作,所以會影響到這塊記憶體所儲存的資料本身。
用兩段程式碼來驗證一下,JS的傳參,到底傳的是什麼:
這裡還要理解一個東西,即我們在檢視或者說輸出變數時,我們輸出的是什麼?肯定輸出的是,變數所指向的那塊記憶體儲存的資料。
第一段程式碼,我們實參是基本資料型別,呼叫函式前後,實參輸出結果沒變,即實參指向的那塊記憶體儲存的資料沒變;
第二段程式碼,我們實參是物件,呼叫函式前後,實參輸出結果改變了,即實參指向的那塊記憶體儲存的資料被函式改變了;
所以,我們可以得出結論,傳參的時候:
- 傳基本資料型別時,是值傳遞;
- 傳物件時,是引用傳遞;