# 傳值(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'}
```

: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)
{"metaMigratedAt":"2023-06-16T12:21:17.882Z","metaMigratedFrom":"Content","title":"傳值(by Value)、傳址(by Reference","breaks":true,"contributors":"[{\"id\":\"663fae2d-2bb5-4437-90b7-96f11a50e120\",\"add\":1403,\"del\":65}]"}