### 🔍小範例大學問👊 # [<font color="#f00">JavaScript</font>] by reference(傳址)與by value(傳值)的異同 ## 1. 基本定義 * by value(傳值):傳遞的是「數值的複製」。 * by reference(傳址):傳遞的是「記憶體的位置。 ## 2. by value(傳值) ```javascript= let a = 1; b = a; console.log(a, b);// 1 1 let b = 2; console.log(a, b);// 1 2 ``` ![](https://i.imgur.com/rGjAmlV.png) 💬說明:基本型別 (Primitive type),在 Javascript 皆是以by value (傳值) 的方式傳遞。 ## 💡 基本型別: 1. Number:數字 2. String:字串 3. Boolean:布林 4. Undefined:未定義 5. Null:空值 6. Symbol:符號 =============>[*MDN資料型別*](https://developer.mozilla.org/zh-TW/docs/Web/JavaScript/Data_structures#%E8%B3%87%E6%96%99%E5%9E%8B%E5%88%A5) ## 3. by reference(傳址) ```javascript= let c = ["前", "中", "後"]; let d = c; console.log(c);//['前', '中', '後'] console.log(d);//['前', '中', '後'] d[0] = "超前"; console.log(c);//['超前', '中', '後'] console.log(d);//['超前', '中', '後'] d = ["改前", "改中", "改後"]; console.log(c);//['超前', '中', '後'] console.log(d);//['改前', '改中', '改後'] ``` ![](https://i.imgur.com/q5TJaxT.png) 💬說明:物件型別,則會以 by reference (傳址)的方式傳遞。但有例外的情形,如果整個陣列全部異動時,就會新建記憶體位址。 ```javascript= let e = { myName:"Peter", myAge:20 }; let f = e; console.log(e);//{myName: 'Peter', myAge: 20} console.log(f);//{myName: 'Peter', myAge: 20} f.myAge= 35; console.log(e);//{myName: 'Peter', myAge: 35} console.log(f);//{myName: 'Peter', myAge: 35} f = { myHome:"Taipei", isSleep:true }; console.log(e);//{myName: 'Peter', myAge: 35} console.log(f);//{myHome: 'Taipei', isSleep: true} ``` 💬說明:物件和陣列是相同的結果。 ## 💡 物件型別: 1. Object:物件 2. Array:陣列 3. Function:函式 --- [[JavaScript] Javascript中的傳值 by value 與傳址 by reference](https://medium.com/itsems-frontend/javascript-pass-by-value-reference-sharing-5d6095ae030b)