---
# System prepended metadata

title: 克服 JS 奇怪的部分 21.  傳值 & 傳參考
tags: ["JavaScript\_", JavaScript 基礎]

---

### 傳值與傳參考的意義是什麼？

- **傳值**（Pass by Value）和 **傳參考**（Pass by Reference）是在程式設計中用來**描述函數或方法如何將參數傳遞給其他函數或方法的方式**。這兩者之間的**區別在於參數在傳遞過程中的內存管理方式**。

### 示例：

- 假設今天有一個 **a 變數** & **b 變數**
  - b 是預計來拷貝資料 a 的變數。
```js
// Primitive value , Copy of primitive value
b = a;
(or pass to a function)
```

### by value

- 簡單來說，藉由傳值獲取的值，若原先指向的變數與值有改變
  ，當下這個值就不能被改變。
- 而這個案例只有在純值的情況下發生。[Primitive value](https://developer.mozilla.org/en-US/docs/Glossary/Primitive)
```js
// 假設 a = 3;
也就是說，b 會指向 3，而這個 3 就是拷貝的位置。(獲得與 a 相同的值)。
// 這是一個 by value 的示例
```
- **by value** 案例：

```js
let a = 1;
let b = a;

a = 3;
console.log(b); // b 沒有因為 a 中途改變值 = 3; 也跟著變化。
```

### by reference

- 所有的**物件**都是 **by refernece**。像是函數，函數在 JavaScript 也是物件。

- 開發時，**若兩個變數都指向同個物件**，假設 `a` 有變化，那拷貝變數 a 的 變數 `b` 則也會被影響。

```js
const obj = {
  content: "hi,obj!",
};

let a = obj;
console.log("a", a);

// b 拷貝了 a
let b = a;
console.log("b", b);

a.content = `I m 'a',first change the value!`;

console.log(obj, a, b);
// obj - 不變 , b 因為受到 a 影響，所以值改變了。
```
### 純值代表了一個記憶體的位置。

- 因為上面的案例已經告訴你了，拷貝純值的話，後續來源值有變動，拷貝變數不會被影響到。

### by reference 不會創建一個記憶體，但會將拷貝變數指向同個記憶體位址


- [延伸參考文章](https://ithelp.ithome.com.tw/articles/10209104)

- [延伸參考教學](https://www.youtube.com/watch?v=r5rYoJFWfN0&t=1008s)