---
# System prepended metadata

title: by reference(傳址)與by value(傳值)的異同

---

### 🔍小範例大學問👊
# [<font color="#f00">JavaScript</font>] by reference(傳址)與by value(傳值)的異同

## 1. 基本定義
* by value(傳值)：傳遞的是「數值的複製」。

* by reference(傳址)：傳遞的是「記憶體的位置。

## 2. by value(傳值)
```javascript=
let a = 1;
b = a;
console.log(a, b);// 1 1
let b = 2;
console.log(a, b);// 1 2
```
![](https://i.imgur.com/rGjAmlV.png)
💬說明：基本型別 (Primitive type)，在 Javascript 皆是以by value (傳值) 的方式傳遞。

##  💡 基本型別：
1. Number：數字
2. String：字串
3. Boolean：布林
4. Undefined：未定義
5. Null：空值
6. Symbol：符號
=============>[*MDN資料型別*](https://developer.mozilla.org/zh-TW/docs/Web/JavaScript/Data_structures#%E8%B3%87%E6%96%99%E5%9E%8B%E5%88%A5)

## 3. by reference(傳址)
```javascript=
let c = ["前", "中", "後"];
let d = c;
console.log(c);//['前', '中', '後']
console.log(d);//['前', '中', '後']

d[0] = "超前";
console.log(c);//['超前', '中', '後']
console.log(d);//['超前', '中', '後']

d = ["改前", "改中", "改後"];
console.log(c);//['超前', '中', '後']
console.log(d);//['改前', '改中', '改後']
```
![](https://i.imgur.com/q5TJaxT.png)
💬說明：物件型別，則會以 by reference (傳址)的方式傳遞。但有例外的情形，如果整個陣列全部異動時，就會新建記憶體位址。

```javascript=
let e = {
    myName:"Peter",
    myAge:20
};
let f = e;
console.log(e);//{myName: 'Peter', myAge: 20}
console.log(f);//{myName: 'Peter', myAge: 20}

f.myAge= 35;
console.log(e);//{myName: 'Peter', myAge: 35}
console.log(f);//{myName: 'Peter', myAge: 35}

f = {
    myHome:"Taipei",
    isSleep:true
};
console.log(e);//{myName: 'Peter', myAge: 35}
console.log(f);//{myHome: 'Taipei', isSleep: true}
```
💬說明：物件和陣列是相同的結果。
##  💡 物件型別：
1. Object：物件
2. Array：陣列
3. Function：函式


---
[[JavaScript] Javascript中的傳值 by value 與傳址 by reference](https://medium.com/itsems-frontend/javascript-pass-by-value-reference-sharing-5d6095ae030b)


