Call by Value、Call by Reference

@yu19941994
@yu19941994
Published in
Nov 14, 2020

在網路上眾多眾多的技術文件中,很常看到「傳值、傳址、傳參考、傳共享」的相關性討論,英文單字則會出現「Call by Value、Call by Address、Call by Reference、Call by Sharing」等多種,並且關於 Call by Reference,有人說是「傳參考」,有人則說是「傳址」。而關於 JS 的物件型別,有人說是 Call by Reference,有人說是 Call by Sharing,又有人說是「傳址」…OMG看了多篇文章都描述不一,決定來記錄一下好了,免得三個月後再回來查詢這些關鍵字,我又陷入一團迷霧中(儘管現在也是很霧煞煞。

1.「Call by Value、Call by Address、Call by Reference的差異」

首先,來了解上述這三個名詞的差異

Call by Value是A複製一樣的值給 B,但兩者的記憶體位址不同

Call by Address 則是 A跟 B 的記憶體位置不同,但 B 的值是「A的記憶體位置」

Call by Reference 則 A跟 B 長得一模模一樣樣,值跟記憶體位置都長得一樣

參考文章:

2.在 JS 中做討論

鑑於 Javascript 中僅有 「基本型別(Primitive Value)」、「物件型別(Object)」兩種變數型態

基本型別沒有意外的是「Call by Value(傳值)」

Call by Value,更動 b 的值不影響 a

那麼最有問題的就是物件了,眾多文章表示,物件似乎可以說是「Call by Reference」但又有那麼一點不同,就是

你可以更改原本物件的值,但重新賦値無法更動到外部的 Object

而這個特性,大家又稱之「Call by Sharing」

Call by Sharing,更動 b 的值,會影響 a
Call by Sharing,b 重新賦值,不影響 a

等等…看到這邊一定頭很痛,但沒關係,只要記得在 JS 中的物件是「Call by Sharing」;或者說 JS 中的物件是「Call by Reference」,但有一點點小例外

3.不同程式語言的不同稱謂

回到第一點,這時一定很納悶「Call by address」在 JS 中為什麼沒有???

好吧請去看 Huli 大大的文章,這篇真的講的超好:

也許是在 C、C++語言中比較會討論到 Call by Address、Call by Pointer,

因為其具有指標性質,

而再次重申,在 JS 中只要記得「基本型別(Primitive Value)是 Call by Value」而「物件(Object)是 Call by Sharing / Call by Reference但有小例外」

然後,Kuro 大大的文章則表示在 JS 中,「基本型別是傳值」而「物件型別是傳址」,連結如下:

*新手學前端,所紀錄僅為吸收網路文章後,所做的匯整筆記,有錯歡迎留言指正

--

--