###### 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