很多人認為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語言: 超好懂的指標,初學者請進~