iT邦幫忙

2023 iThome 鐵人賽

DAY 7
0

傳值(by value)

當將變數 a 透過 = 運算子設置為基本型別(純值)後,再把 a 透過 = 運算子賦值給 b:

var a = 3;
var b;

b = a;

我們知道當執行 var a = 3; 時會替變數 a 將記憶體空間中的值設置成 3,
當執行到 b = a 時,會複製變數 a 在記憶體空間中原本位址的值複製到另一個新的位址,
在記憶體空間中兩個不同位址裡的值會是相同的:

透過 = 運算子將一個變數賦值給另一個變數,
以 b = a 的例子來說,
變數 a 在記憶體位址裡的值會複製到變數 b 自己的另一個記憶體位址中,
當把一個純質型別的變數賦值給另一個變數時變數參考的記憶體位址是 by value 的(兩個變數都有自己參考到的記憶體位址).

傳參考(by reference)

現在把變數 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 的結果:


上一篇
first class function
下一篇
What's this?
系列文
那些必須了解的 JavaScript 特性與寫程式前的思考17
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言