很多人認為JS的傳遞方式是 值是Call by value,
物件及陣列是Call by Reference。甚至還有人宣稱其實JS是Call by sharing,那到底是哪一個呢?
這兩天我們一一來分析這三種參數傳遞方式:
我們都以這個例子作為圖解分析:
var x = "Hola";
var y = x ;
會直接把值拷貝過去
首先會先執行 var x = "Hola",宣告一個變數 x並初始化其值為"Hola":
再來執行var y = x,宣告一個變數y初始化其值為複製x的值,也就是"Hola":

這就是 Call by value 的原理,很簡單對吧?
當第一個變數存在一個值,而另一個變數要取其值時候,只會拿到對方的記憶體位置。
var x = "Hola":
var y = x,宣告變數y並初始化其值為x記憶體位置:

所以我們如果修改y的值,會經由0x11找到x的值並修改。
跟call by reference 非常類似,只是存放值的空間是獨立的,任何變數的值都只能擁有其記憶體位置。
var x = "Hola",宣告變數x並初始化其值為Hola記憶體位置。
var y = x,宣告變數y並初始化其值為Hola記憶體位置。

這個有點像C++中指標的概念,變數只能存放 唯讀的記憶體位置,要修改必須透過記憶體位置找到值Hola並修改其值。
今天我們說了三種參數的傳遞方式,明天我們會來實作JS程式,來探討到底JS是使用哪種參數傳遞。
以上資訊若有錯誤歡迎留言校正!
參考:
深入探討 JavaScript 中的參數傳遞:call by value 還是 reference?
JavaScript - 參數傳遞方式 (1)
C語言: 超好懂的指標,初學者請進~