###### 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)