當將變數 a 透過 = 運算子設置為基本型別(純值)後,再把 a 透過 = 運算子賦值給 b:
var a = 3;
var b;
b = a;
我們知道當執行 var a = 3;
時會替變數 a 將記憶體空間中的值設置成 3,
當執行到 b = a 時,會複製變數 a 在記憶體空間中原本位址的值複製到另一個新的位址,
在記憶體空間中兩個不同位址裡的值會是相同的:
透過 = 運算子將一個變數賦值給另一個變數,
以 b = a 的例子來說,
變數 a 在記憶體位址裡的值會複製到變數 b 自己的另一個記憶體位址中,
當把一個純質型別的變數賦值給另一個變數時變數參考的記憶體位址是 by value 的(兩個變數都有自己參考到的記憶體位址).
現在把變數 a 的值改成物件,
一樣把變數 a 透過 = 運算子賦值給變數 b:
var a = {greeting: 'hi'};
var b;
b = a;
這時候兩個變數的記憶體位址會參考到同一個物件:
當把一個物件型別的變數賦值給另一個變數時變數參考到的記憶體位址是 by reference 的(兩個變數參考到相同的記憶體位址,不會新增與參考到另一個記憶體位址).
透過以下程式碼來實際驗證:
// by value (基本型別-純值)
var a = 3;
var b;
b = a;
a = 4;
console.log(a);
console.log(b);
console.log("-----純值分隔線-----");
// by reference (只修改物件的屬性值)
var c = { greeting: 'hi'};
var d;
d = c;
c.greeting = "hello"; // mutate
console.log(c);
console.log(d);
console.log("-----物件分隔線-----");
// by reference (將型別為物件的變數 d 作為參數傳入並修改屬性)
function changeGreeting(obj) {
obj.greeting = "Hola"; //mutate
}
changeGreeting(d);
console.log(c);
console.log(d);
console.log("-----把 d 當作 function 的參數並修改屬性值分隔線-----");
// 透過 = 運算子賦值一個新的物件給變數 c 時,會新增與參考到新的另一個記憶體位址
c = {greeting: 'howdy'};
console.log(c);
console.log(d);
開發者工具中 console 的結果: