JS 基礎篇 (7) 傳值或傳址

Javascript 的資料可以分為「基本型別」和「物件型別」

  • 基本型別: 資料以純值的形式存在
  • 物件型別: 資料以純值或物件組合而成

基本型別的比較

當今天比較兩個基本型別的資料時,比較的是變數的值。

1
2
3
var a = 10;
var b = 10;
console.log(a === b) // true

物件型別的比較

物件比較的情況下,因為每個js的物件都是個別的實體,在記憶體中存在不同位置。所以即使物件內的value相同,仍是不同物件。

1
2
3
var obj1 = { value: 1 };
var obj2 = { value: 1 };
console.log(obj1 === obj2); // false

傳值或傳址

當你在 JavaScript 中傳遞變數給函數作為參數或將變數賦值給另一個變數時,你實際上是在處理該變數的值。這就涉及到 JavaScript 中的「傳值」和「傳址」的概念。

  1. 傳值(Pass by Value):
    當你將一個基本型別的變數(例如數字、字串、布林值等)傳遞給函數或賦值給另一個變數時,JavaScript 會將該變數的值複製一份,然後將這份複製的值傳遞給函數或賦值給另一個變數。在函數內部修改這個複製的值或新變數不會影響原始變數的值。
1
2
3
4
5
6
7
8
9
let num1 = 5;

function double(num) {
num = num * 2;
return num;
}

console.log(double(num1)); // 輸出 10
console.log(num1); // 仍然是 5,因為 num1 沒有被修改
  1. 傳址(Pass by Reference)

當你將一個物件(包括陣列、函數等)傳遞給函數或賦值給另一個變數時,JavaScript 會將該物件在記憶體中的位置(記憶體參考)傳遞給函數或另一個變數,而不是將物件的值複製一份。因此,在函數內部修改這個物件或新變數會影響到原始物件。

1
2
3
4
5
6
7
8
9
let obj1 = { value: 10 };

function doubleValue(obj) {
obj.value = obj.value * 2;
return obj;
}

console.log(doubleValue(obj1)); // 輸出 { value: 20 }
console.log(obj1); // 會輸出 { value: 20 },因為 obj1 與原始物件引用的是同一個物件
  • 例外情形:

當物件被傳遞給函式作為參數或賦值給另一個變數後,此時若不是修改物件而是重新將物件賦值時,不會影響原來的物件。

1
2
3
4
5
let obj1 = { value: 10 };
let obj2 = obj1;
obj2 = { a: 1 } // 物件重新賦值
console.log(obj1) // { value: 10 }
console.log(obj2) // { a: 1 }