---
# System prepended metadata

title: JavaScript資料儲存-Passing By Value
tags: [JavaScript]

---

## 資料型別
JavaScript是動態型別程式語言
在 JavaScript 中，定義了7種資料型別，又可將他們細分為**原始型別**(Primitive type) 與 **物件型別** (Object type)


#### 基本型別 (Primitive type)
代表**單一值**，如:
* String
* Number
* Boolean
* Symbol
* null、undefined
#### 物件型別 (Object)
 是**資料的集合體**，可以將多個基本型別放入其中，物件也有自己的**屬性**或**方法**，如 object、array、function。
 

---
### undefinded 與 null
首先建議："不要將變數手動設為 undefined，這可能會造成未預期的結果。

* `undefined` 出現的狀況是定義了一變數，但沒有負值
* `null`則是在變數上給予空值
* `null`通常是讓開發者來設定變數沒有值的，javascript通常本身不會給予
* 強制轉型
* `null`是有效的JSON值， `undefined` 不是
  
### typeof()
我們可透過`typeof`來查看型別
```javascript!
let javascriptFun = true;
console.log(typeof javascriptFun) //Boolean
javascruptFun = 'Yes';
console.log(typeof javascriptFun) //String
```


### 原始型別(Primitive type)物件型別 (Object type)兩者差異，在記憶體中儲存的方式不同
![](https://hackmd.io/_uploads/H1eA_2gR2.png)
1. 原始型別 (Primitive type) ：存在**棧(stack)**中，直接儲存資料值 (value)，
2. 物件型別 (Object)：存在**堆(Ｈeap)**中，僅會儲存資料值所在的記憶體位置的地址 (address)，用以當作參考 (reference)，這個參考會指向 Heap 中的資料值，如下圖。
3. ` Stack` 是相對小但存取相對快的記憶體空間，變數會以變數表的概念儲存於其中，表中包含：「變數名稱identifer」、「記憶體位置aderss」、「資料的值value」
4.` Heap` 相對於 Stack 是較大的記憶體空間，更適合儲存 Object data 這種較大的資料，當然相對存取會比較慢。

### Passing By Value-複製值 (value) 
當你將基本型別(Primitive type)數據類型（如unmber、string、boolean等）傳遞給函數時，實際上是將值本身複製給函數的參數。在函數內部對參數的修改不會影響到原始值。
```javascript=
function modifyValue(x) {
  x = 10; // 在函数内部修改参数 x 的值
  console.log(x); // 输出 10
}

let num = 5;
modifyValue(num);
console.log(num); // 输出 5，原始值不受影响
```
### 範例
當你將引用數據類型（如array和object）傳遞給函數時，實際上是將引用（內存地址）傳遞給函數的參數。這意味著在函數內部對參數進行的修改會影響到原始的對像或數組。
```javascript=
function modifyArray(arr) {
  arr.push(4); // 在函数内部修改参数 arr
  console.log(arr); // 输出 [1, 2, 3, 4]
}

let myArray = [1, 2, 3];
modifyArray(myArray);
console.log(myArray); // 输出 [1, 2, 3, 4]，原始数组受影响
```
> JavaScript 中的 "傳值" 和 "傳引用" 取決於傳遞的是 '基本數據類型'還是'引用數據類型'。基本數據類型傳值，而引用數據類型傳引用。這個概念在編寫 JavaScript 函數時非常重要，因為它會影響到函數對參數的操作是否會影響到原始數據。

[參考資料](https://www.programfarmer.com/articles/2021/javascript-pass-by-value-pass-by-reference-pass-by-sharing)
[參考-強制轉型](https://www.cythilya.tw/2018/10/15/coercion/)
[參考-邁向 JavaScript 勇者之路](https://ithelp.ithome.com.tw/articles/10191132)