Skip to content

[javascript] call by reference 還是 call by value?

Published: at 07:46 AM

在 javascript 中,究竟是 call by value 還是 call by reference?

讓我們嘗試執行以下的例子及程式碼測試看看


[javascript]

function add(num) { num+=1; } var a=1; add(a); console.log(a);    // 1

[/javascript]

上面這段程式碼,我們用 add() 將 a 加 1,但實際上並沒有真正的讓 a=2,可以猜測在這個例子中,函式 num 為 a 的複製,而不是真正對 a 的實體做加減。

[javascript] function empty(str) { str=”; } var a=‘hello’; empty(a); console.log(a); // ‘hello’ [/javascript]

上面這段程式碼,我們用 empty() 將 a 的值改為空字串,如上面那個例子,str 也是 a 的複製,不是對 a 的實體操作。

[javascript]

function empty(obj) { obj.str=”; } var a={ str: ‘hello’ }; empty(a); console.log(a); // { str: ” }

[/javascript]

在上面這段程式碼,我們可以發現在物件則是對實體進行操作。

[javascript]

function change(obj) { obj={str: ‘yaya’}; } var a={ str: ‘hello’ }; change(a); console.log(a);     // { str: ‘hello’ }

[/javascript]

從上面這個例子看起來卻不是完全的 call by reference,

因此大概可以發現在 javascript 中,對於 Primitive type(Number、 String及Boolean等)為 call by value。

在物件、陣列及函式時則為 call by reference。(當然有一些爭議)

我個人是認為這和 C 語言的特性很像,本質上都是 by reference,只是傳參考與傳值的差別。(當然,還是有不少爭議就是XD)

ps. 順帶一提,利用 by reference 的特性我們可以做到 Singleton 的特性。

參考資料:

https://pjchender.blogspot.tw/2016/03/javascriptby-referenceby-value.html