傳值與傳參考
這堂課將介紹在 JavaScript 一個很重要的觀念,傳值 pass by value
和傳參考 (傳址) pass by referece
傳值 By Value
一段簡單的程式碼如下,首先,先宣告一個變數 a
並給它一個 primitive value
3,這時候 a
會存在記憶體中的一個位置 0x001
。接著宣告一個 b = a
,b
實際上會建立另一個記憶體位置 0x002
,兩者的值並不會互相干擾,這種情況我們就稱為傳值 pass by value
,這種情況只會發生在值為 primitive type
的變數上。
1 | var a = 3; |
傳址(傳參考) By Reference
相對的,如果宣告一個變數 a
並給它一個型別為物件 (Function 也是) 的值,同樣會在記憶體中給它一個位置 0x001
;但當我們建立另一個變數 b
,並把 b
的值等同於 a
,實際上不會在記憶體中再給它一個位置,變數 a
和 b
都會指向相同的位置 0x001
,所以當 a
的值給便時也會影響到 b
,這種情況我們就稱為傳址 (傳參考) pass by reference
。
一段簡單的程式碼如下,當我們建立一個變數 c
並給它一個物件 object
的值,再建立一個 d
並讓它等於 c
,接著更改 (mutate) c
的值時,d
也會跟著改變; 甚至我們透過一個函式來更改 c
的值時,d
也會跟著改變
1 | var c = { greeting: "Hello" }; |
例外
前面提到如果建立變數 c
並給予一個 object
的值,並新增另一個變數d
等於 c
, 就會透過 pass by reference
的方式指向記憶體中的這個位置,但當我們透過 object literal
的方式重新賦予這個變數另外一個 object
的值時,JavaScript 會在記憶體中新增一個位置來存放這個新的物件,這時候 c
和 d
就會分別指向記憶體中不同的 object
。
1 | var c = { greeting: "Hello" }; |