## 資料型別 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)兩者差異,在記憶體中儲存的方式不同  1. 原始型別 (Primitive type) :存在**棧(stack)**中,直接儲存資料值 (value), 2. 物件型別 (Object):存在**堆(Heap)**中,僅會儲存資料值所在的記憶體位置的地址 (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)
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up