在 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