# 物件傳什麼?參考 or 值 <div class="block"> **本篇會談到** - 傳值( By Value )的『值』是什麼? - 傳參考 ( By Reference)的『參考』是什麼? </div> ## 傳值( By Value )的『值』是什麼? #### 1. 先來說說『純值』有哪些: 純值可以是 `String` `Number` `Boolean` `null` `undefined` [`Symbol`](/@unayojanni/HyzWz9R0u/%2F-kJekSwrT2q8sH_FI_7tXg#✐-Symbol-獨一無二的值) #### 2. 將上述其中一種純值設定到變數 a ```javascript= let a = 33; // 將上述其中一種純值設定到變數 = 定義 a 是 33 // 此時 變數 a 知道了這個純值的記憶體位址。 ``` #### 3. 創造一個新的變數 b 並且賦予變數 a 創造一個新的變數,會有一個新的記憶體位置, `b = a` 就會拷貝 a 純值,放到新建立的 b 記憶體位址上 ```javascript= let a = 33; let b = a; // 傳值把 a 記憶體,複製一份到 b 記憶體 console.log(b); // 33 b = 30; console.log(a, b); // 33 30 // 各自的記憶體位置 不會互相影響 ``` #### 4.此時變完成了傳值 ( By Value ) ## 傳參考 ( By Reference)的『參考』是什麼? **`物件`、`陣列`、`函式`**,都是物件傳參考特性,並不會直接寫值,會建立一個記憶體空間 :::info 只修改屬性值的話 就可以用 const 宣告的物件 ::: #### 1.設定變數 a 並且賦予值為物件類型,變數 a 仍然會得到物件的記憶體位址。 ```javascript= const a ={ name: '小明', obj: {}, } ``` #### 2. `b = a` ,變數 b 此時不會得到一個新的記憶體位址,而是會<font color="red">改變指向到變數 a 的記憶體位址</font>,並不會創造新的拷貝物件。 ```javascript= const a ={ name: '小明', obj: {}, } // 設定一個變數 a ,物件類型 const b = a; // 將變數 b ,指向到 變數 a 的記憶體空間 // 此時,a b 物件指向相同地方 console.log(a === b); // true b.name = '阿花'; // 現在 a, b 都在相同記憶體位置,所以改變記憶體空間的內容,會整個一起改變 console.log(b); // {name: "阿花", obj: {…}} console.lgo(a); // {name: "阿花", obj: {…}} ``` :::success 提醒 again: `物件`、`陣列`、`函式`,都是物件傳參考特性,並不會直接寫值,會建立一個記憶體空間 ::: > 參考: > [JavaScript ES6 Symbol 資料型態](https://www.fooish.com/javascript/ES6/Symbol.html) ###### tags: `JS` {%hackmd @unayojanni/H1Qq0uKkK %}