x
被賦予 5
這個數值,然後透過 y = x
的方式為變數 y
賦值,因此 x
和 y
一開始的變數內容都是 5
。x
賦予新的值 10
,此時 x
是 10
,但 y
仍是 5
。x
的值,y
會不受影響?y
指向一塊新的記憶體,然後將變數 x
裡的值複製一份放進去,等於變數 x
和 y
裡存放的是兩份獨立的資料,其中一份改變,不會影響另一份。person1
賦予一個物件,透過 person2 = person1
的方式為 person2
賦值,person1
和 person2
兩個物件的 money
屬性一樣都是 111
。person1.money
更換值的內容,連 person2
的屬性也一起變動到。person1
和 person2
其實指向同一個物件,就像同一個房間有兩個入口,從哪一個入口進去,看到的都是同一個房間內容。因此,對 person1
作任何變動,也等同對 person2
作變動。註:null
雖然用typeof
運算的結果是回傳object
,但null
在行為上歸屬原生型別。
person
傳遞給函數 rename()
作為參數,並在 rename()
裡面改變值。{name: "OneJar"}
再印 {name: "XXX"}
囉?obj
變更值的部分。例子中是使用物件實字 (Object Literals) 的方式來變更值。筆者按:這裡的介紹比較偏向概念性,大幅簡化細節,實際上作業系統底層對記憶體的操控機制沒那麼簡單。但對於上層高階語言來說,這樣概念性的理解應該足夠應付一般開發所需。
x = y
這個動作時,都是把 x
內儲存的值複製一份到 y
裡 (不管這個值的內容是一個數值或一個位址)。大家對 call by reference 以及 call by value 的「定義」其實都不盡相同,而且也沒有一個權威性的出處能夠保證這個定義是正確的。
n
和 obj
來說:123
123
{ name: "OneJar" }
0x0001
這樣的記憶體位址obj1 = obj2
傳值,就屬於 Reference 的複製,而非 Value 的複製。x = y
傳值都屬於 Value 的複製。程式開發的世界中,名詞的創造經常是隨意的。這些名詞通常沒有明確的定義,一開始只是為了溝通方便,而隨著聽聞者各自的領會與轉述,加上時間與歷史的推移,它們的定義會發生岐義而各自發展,最後失去了溝通的意義。
在《松本行弘的程式設計世界》的〈語彙與共通語言的重要性〉這篇文章中,作者談到,為某個概念決定適當的名詞,目的是在設計時能有共同的語彙,也能讓開發者意識到它們的存在,這才是名詞存在的真正意義。