---
# System prepended metadata

title: 傳值(by Value)、傳址(by Reference

---

# 傳值(by Value)、傳址(by Reference
傳值：傳遞變數的值。
傳址：傳遞變數在記憶體中的「位址」。物件和陣列屬這類型。
## 傳值 by Value
Javascript 中除了物件以外的所有型別，都是基本型別，而基本型別，就只是一個純值，稱為基本型別 (Primitive type)，在 Javascript 會是以傳值 by value 的方式傳遞基本型別 String、Number、Boolean、Null和Undefined..等。
> 一般基本型操作上就是使用pass by value傳遞，假設有兩個變數x和y，當我們賦予他們值時會在記憶體個別產生一個空間儲存，若是將y的值賦予給x，x變數也會再次接收到另一個新的記憶體空間，此時x和y的值雖然相同，但是個別在不一樣的記憶體空間。
```javascript=
let x = 1; 
let y = 2;

console.log(x,y); //輸出 1 2
x = y; //將y的值賦予給x
y++;
console.log(x,y); //輸出 2 2
// x不因y的值更動而產生變化，因為他們儲存在不一樣的記憶體空間
```

## 傳址 by Reference
除了基本型別，其他型別都算是物件型別，則會以 by reference 傳址的方式傳遞：Object Array Function
> 傳址與傳值不同，是針對同一個記憶體空間去做動作，在傳遞時並不會產生新的記憶體空間，因此變數若是有互相賦值的話另一個變數也會受到影響
```javascript=
let animal = {
    catSay : "meow"
}
let bird = {
    duckSay : "quack"
}

console.log(animal); //輸出{catSay: 'meow'}
console.log(bird);   //輸出{duckSay: 'quack'}

bird = animal;
animal.catSay = "me me me"; //修改animal中的值

console.log(animal); //輸出{catSay: 'me me me'}
console.log(bird);   //輸出{catSay: 'me me me'}
```
![](https://i.imgur.com/8DQH3n5.png)
:arrow_up:指向了同一個記憶體空間，因此當內部修改內容時再次讀取出來的值也會發生改變。


## 參考資料
[重新認識 JavaScript: Day 05 JavaScript 是「傳值」或「傳址」](https://ithelp.ithome.com.tw/articles/10191057))
[[JavaScript] Javascript中的傳值 by value 與傳址 by reference](https://medium.com/itsems-frontend/javascript-pass-by-value-reference-sharing-5d6095ae030b)