---
# System prepended metadata

title: by reference (傳參考)、by value(傳值)
tags: [六角學院, Javascript]

---

# by reference (傳參考)、by value(傳值)
###### tags: `六角學院` `Javascript`


## Javascript的兩種型別

JavaScript 的資料可以分成「基本型別」(Primitives) 與「物件型別」(Object) 兩大類。

### 基本型別

簡單來說就是純值，包括有可能有number、boolean、srtring等等的型別，通常都是使用 call by value 來做呼叫。

在基本型別中要判斷兩個變數是否相等，需要去比較兩者內的"值"是否相等。

```jsx
let a = 10;
let b = 10;
console.log( a === b );      // true
> ```

### 物件型別

物件型別指的是可能由零或多種不同型別 (包括純值與物件) 所組合成的物件，通常都是使用 call by **reference** 來做呼叫。

就算不同的物件裡宣告相同的變數，他們可以稱為等值，但他們仍然屬於不同的"實體(instance)"。

## 傳值呼叫 call **by value**

對於基本型別來說，當我們將某b變數賦予給a時，會取出物件b的值塞給a變數，但並不代表b的值會改變，因為他們是用裡面的值去做辨別的，這個就是「**傳值**」 (pass by value)。，以下例子 :

```jsx
var a = 10;
var b = a;
a = 100;

console.log( a );   // 100
console.log( b );   // 10

//當a更新後並不會影響b的值
```

> 簡單來說，表面上b的值是複製a變數得來的，但實際上b是自己開了一個新的空間並將裡面的值設為10，與a仍然是互相獨立不受影響的變數。

## 傳址呼叫

直接來看範例 : 

```jsx
var a = { value: 10 };
var b = a;

console.log( a.value );       // 10
console.log( b.value );       // 10

a.value = 100;

console.log( a.value );       // 100
console.log( b.value );       // 100
```

我們可以看出來，此時的a與b是指向同一塊記憶體，也就是同一個實體的，所以當a被指向為b的時候，兩個變數都指向同一塊記憶體，當其中一個被改變時，另一個理所當然地也會一起被修改。像這種透過引用的方式來傳遞資料，接收的其實是引用的「參考」而不是值的副本時，我們通常會稱作「**傳址**」 (pass by reference)。

## 參考資料

[https://ithelp.ithome.com.tw/articles/10191057](https://ithelp.ithome.com.tw/articles/10191057)