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

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



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

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

function empty(str) { str=''; }
var a='hello';
empty(a);
console.log(a); // 'hello'

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

 


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

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

 


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

從上面這個例子看起來卻不是完全的 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

Leave a Reply