# JS學習筆記: javascript的「call by reference」
今天如果我們有下面一段程式碼,他會怎麼顯示。
```javascript=
var a = [ 1, 2, 3 ]
var b = a
a.push(5)
console.log(b)
```
答案是 [1, 2, 3, 5]
改動的明明是a,b也跑來湊熱鬧跟著變動,按照原本賦值的理解,應該是像以下
```javascript=
var a = 5
var b = a
a = 10
console.log(b)
```
這時答案會是 5,非常的符合直覺。
上面兩個差別在於「型別」的不同,javascript分為兩種型別
## 「基本型別」(primitives)
包含number、string、boolean、null、undefined、symbol
## 「物件型別」(object)
物件、陣列、函式、日期等
以上的型別分類參考至[你懂 JavaScript 嗎?#4 型別(Types)]( https://cythilya.github.io/2018/10/11/types/)
基本型別是使用「call by value」,也就是說每個宣告的變數都會使用一個記憶體去儲存。
彼此之間是互不干擾的。
```javascript=
var a = 5 //產生記憶體給a,內容為5
var b = a //產生記憶體為b,內容為a的值,也一樣是5
a = 10 //記憶體a的值更新為10
console.log(b) //印出記憶體b的值,一樣是5
```
而物件型別是使用「call by reference」,我們宣告的變數本身本身也會產生一個記憶體給他的值。
而該變數像是生出一個箭頭,指向那個記憶體的位置,也因此叫做「call by reference」,是一個參考的概念。
```javascript=
var a = [ 1, 2, 3 ] //產生記憶體位址,儲存 [ 1, 2, 3 ]這個內容,且a指向此物件內容
var b = a //b不佔記憶體,並且b的值一樣指向a的同樣參照位址,因此一樣是 [ 1, 2, 3 ]
a.push(5) //將5 push進去a參照的陣列(物件)中,因此參照的陣列變成[ 1, 2, 3, 5]
console.log(b) //b參照的位址以發生改變,因此這裡最後的答案一樣是[ 1, 2, 3, 5]
```
由此概念可以知道,我們如果將上面的內容改成下面這樣。
```javascript=
var a = [ 1, 2, 3 ]
var b = a
b.push(5)
console.log(a)
```
我們得到的答案是一模一樣的,都是[ 1, 2, 3, 5]
###### tags: `js學習筆記`