# by reference (傳參考)、by value(傳值)
###### tags: `javascript 基礎知識`
## 變數基礎型別以及物件型別
JavaScript 的變數中分為兩種型別,基礎型別以及物件型別。
基礎型別分為:
1. 數字型別
2. 字串型別
3. 布林
4. undefined
5. null
6. symbol
物件型別分別為
1. 陣列
2. 物件
3. 函式
在JavaScript 裏面,基礎型別的行為皆為傳值,而物件型別則為傳參考
## 傳值
### 變數的記憶體位置
當我們宣告一個變數的時候,電腦會拿ㄋ一個記憶體空間來紀錄我們需要儲存的值,當你重新賦予值的時候,原本的記憶體空間並不會被覆蓋新的值,而是新增一個記憶體空間來存放新的值。
### 傳值的運作方式
那如果我們宣告一個新的變數並賦予這個新的變數一個既有的基礎型別變數,那在記憶體中是怎麼運作的呢?
他會新增一個記憶體位置複製既有變數的值把值放到新的記憶體裡面。
而這就是所謂的傳值,而不是讓新的變數去參考既有變數的記憶體空間
```javascript=
let a = 1;
let b = a;
console.log(a,b)
//1,1
a = 3;
console.log(a,b)
//3,1 變數b的值不變,因為他已經複製變數a還是1的時候的值了
```
## 傳參考
### 傳參考的運作方式
哪假設如果我們進行一樣的變數賦予變數的動作,但是我們這次不是使用基礎型別的變數,而是使用物件型別的變數,那這個時候就會發生傳參考。
也就是說新的變數的記憶體指向會指向到既有變數的記憶體,而非複製然後新增一個記憶體,簡單的說,就是既有變數以及新的變數,都是指向同一個記憶體。
### 傳參考的注意事項
所以相對於傳值的直觀,在物件型別的變數上,如果我們修改了新的變數的值,他就會影響既有變數的值,因為他們是指向到同一個記憶體
```javascript=
let a = [1,2,3,4];
let b = a;
console.log(b)
//[1,2,3,4]
b.push(5)
console.log(a)
//[1,2,3,4,5]
```
## 參考文章
[JavaScript] Javascript中的傳值 by value 與傳址 by reference
https://medium.com/itsems-frontend/javascript-pass-by-value-reference-sharing-5d6095ae030b