---
# System prepended metadata

title: 傳值(by Value)、傳址(by Reference)
tags: [六角JS 直播班 - 2021 秋季班]

---

###### tags: `六角JS 直播班 - 2021 秋季班`
傳值(by Value)、傳址(by Reference)
===
>### 在Javascript中，傳遞參數的方式可分為兩種
- 傳值（Call by value 或 Pass by value）
- 傳址/傳參考（Call by reference 或是 Pass by reference）

## 傳值
除了「物件型別」以外的型別都歸類成「基本型別」，「基本型別」則會使用傳值的方式傳遞。

基本型別有以下幾種：
- 字串
- 數字
- 布林
- undefined
- null
- symbol

<br>

>舉例！
```javascript=
let a = "小美人魚"
let b =a
console.log(b) // "小美人魚"

b = "小比目魚"
console.log(a); // "小美人魚"
console.log(b); // "小比目魚"

```
變數b雖然值跟變數a一樣是"小美人魚"，但指向的是不同的記憶體，b得到的是a的值，非a的記憶體，兩者是獨立的，所以不會互相影響。

## 傳址
「物件型別」會使用傳址的方式傳遞：

物件型別有以下幾種：
- function
- object
- array

<br>

>舉例！
```javascript=
let arr1 = [1,2,3]
let arr2 =arr1
console.log(arr2) //[1,2,3]

arr1[0] = 7
console.log(arr1) //[7,2,3]
console.log(arr2) //[7,2,3]
```
arr2指向的記憶體與arr1相同，因此若arr1的值改變，arr2也會跟著改變。

>例外！
```javascript=
let arr1 = [1,2,3]
let arr2 =arr1
console.log(arr2) //[1,2,3]

arr1 = [4,5,6]
console.log(arr1) //[4,5,6]
console.log(arr2) //[1,2,3]
```
**以等號賦予arr1新的值，則會產生另一個記憶體空間**，此時arr1跟arr2不再指向同一個記憶體。

<br>

>參考資料
>[JavaScript 的「傳值」與「傳址」](https://hackmd.io/@chupai/B13YRDJJB)
>[[JavaScript] Javascript中的傳值 by value 與傳址 by reference](https://medium.com/itsems-frontend/javascript-pass-by-value-reference-sharing-5d6095ae030b)