JavaScript 的型別有兩種 - 純值與物件,而在 JavaScript 中,賦予一個值到變數上時會有兩個特性 - 傳值與傳參考,純值是透過傳值的方式來做傳遞,而物件則是透過傳參考,以下是關於傳值與傳參考的說明:
傳值是一種複製的概念,而 純值是透過傳值的方式來做傳遞,當一個變數被賦予至另一個變數上,在賦予值之後,兩個變數就沒有關係了
以下範例是使用字串(純值)來做傳遞
變數 person 後,記憶體會存放 變數 person 的名稱與值變數 person2 並將 變數 perosn 賦予至 變數 person2 上,變數 person2 會直接接收 變數 perosn 的值 -> 此種方式就是傳值變數 person2 的值,變數 person 的值也不會改變var person = 'Carol';
var person2 = person;
person2 = 'Mary';
console.log(person); // Carol
console.log(person2); // Mary
運作過程:

純值有:
- Number 數字型別
- String 字串型別
- Boolean 布林值
- Null 空
- Undefined 未定義
- BigInt 整數數值
- Symbol
物件型別(ex: 物件、陣列、函式)都屬於傳參考
此範例中當更改了 變數 person2 的值,變數 person 同樣也會被更改到,因他們指向相同物件。使用嚴格相等也可看到 變數 person、變數 person2 是指向同個記憶體參考路徑
變數 person 並賦予一個物件型別的值,這個物件會存放在記憶體中,而 變數 person 則會指向此物件的 記憶體參考路徑
變數 person 賦予至 變數 person2,變數 person2 也會指向同一個 記憶體參考路徑
變數 person2 的物件時,因與 變數 person 是指向相同物件,所以 變數 person 也同樣會被更改到var person = {
name: 'Carol',
money: 200
};
var person2 = person;
person2.nickName = 'Jay';
console.log(person); // {name: 'Jay', money: 200}
console.log(person2); // {name: 'Jay', money: 200}
console.log(person === person2); // true
範例1 運作過程

當變數重新賦予新的物件時,表示指向新物件的 記憶體參考路徑
此範例中當將 變數 person2 重新賦予一個新的物件,變數 person2 會指向新物件,所以就算修改 變數 person2 也不會影響 變數 person。使用嚴格相等也可看到 變數 person、變數 person2 是指向不同個記憶體參考路徑
變數 person 一個物件型別的值,此物件會存放在記憶體中,而 變數 person 會指向此物件的 記憶體參考路徑
變數 person 賦予至 變數 person2,變數 person2 會與 變數 person 指向同一個 記憶體參考路徑
變數 person2 一個物件型別的值,變數 person2 會指向新物件的記憶體參考路徑
變數 person2 的物件時,因與 變數 person 已指向不同的 記憶體參考路徑,故 變數 person 不會被更改到var person = {
name: 'Carol',
money: 200
};
var person2 = person;
person2 = { name: 'Jay' };
person2.name = 'Mary';
console.log(person); // {name: 'Carol', money: 200}
console.log(person2); // {name: 'Mary'}
console.log(person === person2); // false
範例2 運作過程

心得: 畫圖真的很花時間 ><