JS 基本型別(Primitives)

前幾天複習了 JS 基本型別,把重點整理了一下。

JS 中,值分兩種:基值(Primitive)和物件(Object)。

基值不可變

基值是不可變的(immutable),物件預設是可變的。要理解這句話,得先理解「變數」與「值」之間是不同的兩件事。

JS 是弱型別,變數只是個裝載值的「容器」,型別不在變數身上,型別是跟著「值」本身。

常被混淆的點是:

1
2
3
var a = 3;
a = 4;
console.log(a) // 4

有些人會以為上述代表基值被改變,事實上這是將「基值」指定給「變數」的過程。變的是變數所指向的值,而不是值本身。

再來看物件:

1
2
3
var a = {x: 3};
a.x = 4;
console.log(a) // {x: 4}

改變的是「物件」這個值本身,而「變數」 a 仍指向相同的物件。

JS 裡面有幾個基於此觀念所發展出來的設定:

  1. Call by Value
1
2
3
4
5
6
7
8
var a = 3;

function addOne(number) {
number++
}

addOne(a); // 4
console.log(a) // 3 (不變)
  1. String 方法不會修改到原 String
1
2
3
var str = 'hello';
str.toUpperCase();
console.log(str) // 'hello' (不變)

基值種類

基值有六種類型: nullundefinedbooleannumberstringsymbol

null

代表空值,通常用來預留空位給變數,會蓄意將 null 指定給某個變數。一個變數沒指定值也不會是 null,而是 undefined
nulltypeof 檢視會顯示 object

undefined

用來表示未定義,例如一個變數只宣告、不給值,就會是 undefined 。未定義並不等於未宣告。

判斷一個變數有無被宣告,直接用 if(someVar === undefined) 會遭遇 Reference Error 問題,可以用 if(typeof someVar === 'undefined') 來避免執行時報錯。

boolean

true or false 。有些值被強制轉型成 boolean 時會呈現 false 狀態,這些職稱為 falsy 。所有 falsy 為: nullundefined0NaN'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 的值。