(1) 原始型別 & 物件型別的主要差異與運作原理
型別的差異
JavaScript 的型別分為以下兩種。
- 「原始型別」,沒有屬性與方法。
- 「物件型別」,可任意存取屬性與方法。
原始型別 (Primitive types) 包括
- number
- string
- boolean
- null
- undefined
- symbol (ES6)
如何確定變數是 「原始型別」 還是 「物件型別」?
使用 typeof 方法
1 |
|
到這邊會有個疑問是,為什麼會說「在原始型別上無法設定屬性」? 我們在設定 string.length
或是 str.split
的時候可以操作,那位甚麼會提到我們無法設定屬性和方法。
這是因為 JS 考慮到需要節省系統資源,所以原始型別在使用時會 自動裝箱(boxing)。
形成原始型別包裹物件,使用完畢後會 自動拆箱(unboxing) 還原回原始型別。
此外原始型別包裹物件則可用 valueOf
方法取得對應的原始型別。
1 |
|
1 |
|
裝箱 boxing 與 拆箱 unboxing 例子
我們日常使用為以下:
1 |
|
它的內部原理
1 |
|
一些小知識
需要特別注意的是,在數學運算時
- 會優先呼叫
.valueOf
方法 - 若回傳「非原始型別」則會改呼叫
.toString
方法。
以下範例:
範例一
當 alert(n1)
時,回傳的是 valueOf
的 ‘five’,當使用到數學運算時,用到的就是 toString
的 5 。
1 |
|
範例二
當 valueOf
裡面回傳的是 物件(非原始型別) 時,就會使用 toString 方法,所以就是 15。
1 |
|
(1) 原始型別 & 物件型別的主要差異與運作原理
https://phoebeho.com/js-advanced/20211216/719345942/