---
# System prepended metadata

title: 傳址
tags: [Call by Reference]

---

###### tags: `Call by Reference`


# 傳址

:rocket: :rocket: :rocket: 

---
### PT1

![](https://i.imgur.com/NUdyDb3.png)


1.將a的位址賦予變數b，此時變數a跟變數b都指向同個物件{name:"reds"}

2.等號左邊的a是使用a的位址找到物件{name:"reds"}，而.name是此物件的name"屬性"。
等號右邊是將物件的name屬性的"值"改為"hello"，此時修改的是物件{}本身

3.透過b的位址(與a相同)找到name屬性被修改為"hello"的物件本身

4.給a新的位址指向物件{name:"Eric"}

5.b還是指向原有物件{name:"hello"}

6&7.修改"新"物件{name:Eric}的屬性不會影響到b位址指向的物件{name:"hello}"

---
### PT2
![](https://i.imgur.com/vHdo7Kc.png)
1.將b的位址的"值"(假設為放在記憶體中的0001號位址)當作參數帶入函式rename:
```
rename(b){
    b={name:"Eric"}; //原等號左邊的b是位址的"值"(0001)，因指向等號右邊的新物件
                        {name:"Eric"}，可以說此時
                        等號左邊為一個變數，名稱為b，b的"值"為新物件的位址(0002)//
    
    console.log(b);//印出變數b(值為0002位址)的物件
    return b};//回傳變數b的位址0002
```

***結論:
原始參數（例如一個數字）被作為值傳遞給函式，如果呼叫的函式改變了這個參數的值，不會影響到函式外部的原始變數。***

***如果傳遞一個物件（例如 Array (en-US) 或自定義的其它物件）作為參數，而函式改變了這個物件的屬性，這樣的改變對函式外部是有作用的(因為是傳遞物件的位址***

***請注意，重新給參數指定一個對象(物件)，並不會對函式的外部有任何影響，因為這樣只是改變了參數的值，而不是改變了對象的一個屬性值***


結論來源:
https://developer.mozilla.org/zh-TW/docs/Web/JavaScript/Guide/Functions

其他補充範例:https://ithelp.ithome.com.tw/articles/10192342

