JS 基本型別(Primitives)
前幾天複習了 JS 基本型別,把重點整理了一下。
JS 中,值分兩種:基值(Primitive)和物件(Object)。
基值不可變
基值是不可變的(immutable),物件預設是可變的。要理解這句話,得先理解「變數」與「值」之間是不同的兩件事。
JS 是弱型別,變數只是個裝載值的「容器」,型別不在變數身上,型別是跟著「值」本身。
常被混淆的點是:
1 | var a = 3; |
有些人會以為上述代表基值被改變,事實上這是將「基值」指定給「變數」的過程。變的是變數所指向的值,而不是值本身。
再來看物件:
1 | var a = {x: 3}; |
改變的是「物件」這個值本身,而「變數」 a
仍指向相同的物件。
JS 裡面有幾個基於此觀念所發展出來的設定:
- Call by Value
1 | var a = 3; |
- String 方法不會修改到原 String
1 | var str = 'hello'; |
基值種類
基值有六種類型: null
、undefined
、boolean
、number
、string
、symbol
。
null
代表空值,通常用來預留空位給變數,會蓄意將 null
指定給某個變數。一個變數沒指定值也不會是 null
,而是 undefined
。null
用 typeof
檢視會顯示 object
。
undefined
用來表示未定義,例如一個變數只宣告、不給值,就會是 undefined
。未定義並不等於未宣告。
判斷一個變數有無被宣告,直接用 if(someVar === undefined)
會遭遇 Reference Error 問題,可以用 if(typeof someVar === 'undefined')
來避免執行時報錯。
boolean
true
or false
。有些值被強制轉型成 boolean
時會呈現 false
狀態,這些職稱為 falsy 。所有 falsy 為: null
、 undefined
、 0
、 NaN
、 'false'
、 ""
。其餘為 truthy 。
number
全部都是雙精度浮點數,因此每個 number
值佔 64 bits 。
浮點數運算會有精度問題,例如: 0.1 + 0.2 === 0.3
會是 false
。這時可以用代表最小容許誤差 Number.EPSILON
來解決這件事。
在運算中絕對安全的整數範圍是 Number.MAX_SAFE_INTEGER
~ Number.MIX_SAFE_INTEGER
之間,值大概是 2^53 ~ -2^53
。
另外有幾個特殊值:
0
是唯一正負相等的數字。Infinity
、 -Infinity
在數字除以 0 時會出現。任何數除以 Infinity
會等於 0 。NaN
代表非有效的數字運算的結果。 NaN
是唯一一個不等於自己的值。
string
字串在 JS 並不代表字元陣列,因為字元「陣列」屬於物件,是可以被修改的,字串不行。
symbol
一串用來表示 priviate object property key 的值。