JavaScript 中的值永遠都是特定類型的。例如,字串或數字。
JavaScript 中有八種基本資料類型。我們將在此概略介紹這些類型,並在後續章節中詳細說明每種類型。
我們可以在變數中放入任何類型。例如,變數可以同時儲存字串和數字
// no error
let message = "hello";
message = 123456;
允許這樣做的程式語言(例如 JavaScript)稱為「動態類型」,表示存在資料類型,但變數不受任何類型約束。
數字
let n = 123;
n = 12.345;
數字類型同時表示整數和小數。
數字有許多運算,例如乘法 *
、除法 /
、加法 +
、減法 -
等。
除了常規數字之外,還有屬於此資料類型的「特殊數字值」:Infinity
、-Infinity
和 NaN
。
-
Infinity
代表數學上的 無限大 ∞。它是一個大於任何數字的特殊值。我們可以透過除以零得到它
alert( 1 / 0 ); // Infinity
或直接參考它
alert( Infinity ); // Infinity
-
NaN
代表計算錯誤。它是錯誤或未定義的數學運算結果,例如alert( "not a number" / 2 ); // NaN, such division is erroneous
NaN
是黏著的。任何對NaN
進行的後續數學運算都會回傳NaN
alert( NaN + 1 ); // NaN alert( 3 * NaN ); // NaN alert( "not a number" / 2 - 1 ); // NaN
因此,如果數學表達式中某處有
NaN
,它會傳播到整個結果(只有一個例外:NaN ** 0
是1
)。
在 JavaScript 中進行數學運算很「安全」。我們可以做任何事:除以零、將非數字字串視為數字等。
腳本永遠不會因致命錯誤(「死亡」)而停止。最糟的情況下,我們會得到 NaN
作為結果。
特殊數字值正式屬於「數字」類型。當然,它們不是這個詞的通常意義上的數字。
我們將在 數字 章節中看到更多關於數字運算的內容。
BigInt
在 JavaScript 中,「數字」類型無法安全地表示大於 (253-1)
(即 9007199254740991
)或小於 -(253-1)
的負整數值。
更精確地說,「數字」類型可以儲存更大的整數(最大到 1.7976931348623157 * 10308
),但在安全整數範圍 ±(253-1)
之外,會產生精確度錯誤,因為並非所有數字都符合固定的 64 位元儲存空間。因此,可能會儲存「近似」值。
例如,這兩個數字(略高於安全範圍)是相同的
console.log(9007199254740991 + 1); // 9007199254740992
console.log(9007199254740991 + 2); // 9007199254740992
因此,大於 (253-1)
的所有奇數整數都無法儲存在「數字」類型中。
對於大多數目的來說,±(253-1)
範圍已經足夠了,但有時我們需要真正大整數的完整範圍,例如,對於密碼學或微秒精度的時間戳記。
BigInt
類型最近被新增到語言中,用於表示任意長度的整數。
BigInt
值是透過在整數結尾加上 n
來建立的
// the "n" at the end means it's a BigInt
const bigInt = 1234567890123456789012345678901234567890n;
由於很少需要 BigInt
數字,因此我們在此不介紹它們,而是將它們放在一個獨立的章節 BigInt 中。當你需要這麼大的數字時,請閱讀它。
目前,BigInt
在 Firefox/Chrome/Edge/Safari 中受支援,但在 IE 中不受支援。
你可以查看 MDN BigInt 相容性表格 以了解支援哪些瀏覽器版本。
字串
JavaScript 中的字串必須用引號括起來。
let str = "Hello";
let str2 = 'Single quotes are ok too';
let phrase = `can embed another ${str}`;
在 JavaScript 中,有 3 種類型的引號。
- 雙引號:
"Hello"
。 - 單引號:
'Hello'
。 - 反引號:
`Hello`
。
雙引號和單引號是「簡單」引號。在 JavaScript 中,它們幾乎沒有區別。
反引號是「擴充功能」引號。它們允許我們透過將變數和表達式包在 ${…}
中,將它們嵌入字串中,例如
let name = "John";
// embed a variable
alert( `Hello, ${name}!` ); // Hello, John!
// embed an expression
alert( `the result is ${1 + 2}` ); // the result is 3
${…}
內部的表達式會被評估,而結果會成為字串的一部分。我們可以將任何東西放入其中:一個變數,例如 name
,或一個算術表達式,例如 1 + 2
,或更複雜的東西。
請注意,這只能在反引號中進行。其他引號沒有這種嵌入功能!
alert( "the result is ${1 + 2}" ); // the result is ${1 + 2} (double quotes do nothing)
我們將在 字串 章節中更深入地探討字串。
在某些語言中,有一個特殊的「字元」類型,用於表示單一字元。例如,在 C 語言和 Java 中,它稱為「char」。
在 JavaScript 中,沒有這樣的類型。只有一個類型:字串
。字串可能包含零個字元(為空)、一個字元或多個字元。
布林(邏輯類型)
布林類型只有兩個值:true
和 false
。
此類型通常用於儲存是/否值:true
表示「是,正確」,而 false
表示「否,不正確」。
例如
let nameFieldChecked = true; // yes, name field is checked
let ageFieldChecked = false; // no, age field is not checked
布林值也會作為比較的結果
let isGreater = 4 > 1;
alert( isGreater ); // true (the comparison result is "yes")
我們將在 邏輯運算子 章節中更深入地探討布林值。
「null」值
特殊值 null
不屬於上述任何類型。
它形成了一個獨立的類型,其中只包含 null
值
let age = null;
在 JavaScript 中,null
不是「對不存在物件的參考」或「空指標」,就像在其他一些語言中一樣。
它只是一個特殊值,表示「無」、「空」或「值未知」。
上面的程式碼表示 age
是未知的。
「undefined」值
特殊值 undefined
也獨立存在。它形成了一個自己的類型,就像 null
一樣。
undefined
的意思是「值未指定」。
如果宣告了一個變數,但未指定,則其值為 undefined
let age;
alert(age); // shows "undefined"
技術上來說,可以將 undefined
明確指定給變數
let age = 100;
// change the value to undefined
age = undefined;
alert(age); // "undefined"
…但我們不建議這樣做。通常,人們使用 null
來指定變數的「空」或「未知」值,而 undefined
則保留為未指定事項的預設初始值。
物件和符號
物件
類型很特別。
所有其他類型都稱為「原始類型」,因為它們的值只能包含一個東西(無論是字串、數字或其他任何東西)。相比之下,物件用於儲存資料集合和更複雜的實體。
由於物件如此重要,因此值得特別對待。我們將在 物件 章節中學習更多關於原始類型後,再處理它們。
symbol
類型用於為物件建立唯一的識別碼。我們必須在此提及它以求完整性,但也要等到我們了解物件後再深入探討。
typeof 運算子
typeof
運算子會傳回運算元的類型。當我們想要以不同的方式處理不同類型的值,或只是想快速檢查時,它會很有用。
呼叫 typeof x
會傳回一個包含類型名稱的字串
typeof undefined // "undefined"
typeof 0 // "number"
typeof 10n // "bigint"
typeof true // "boolean"
typeof "foo" // "string"
typeof Symbol("id") // "symbol"
typeof Math // "object" (1)
typeof null // "object" (2)
typeof alert // "function" (3)
最後三行可能需要額外的說明
Math
是內建物件,提供數學運算。我們會在 數字 章節中學習它。在這裡,它只作為物件的範例。typeof null
的結果為"object"
。這是typeof
中公認的錯誤,源自 JavaScript 的早期,並為了相容性而保留。null
絕對不是物件。它是一個具有自己獨立類型的特殊值。typeof
在此的行為是錯誤的。typeof alert
的結果為"function"
,因為alert
是函式。我們會在下一章中研究函式,在那裡我們也會看到 JavaScript 中沒有特殊的「函式」類型。函式屬於物件類型。但typeof
以不同的方式處理它們,傳回"function"
。這也源自 JavaScript 的早期。技術上來說,這種行為並不正確,但在實務上可能很方便。
typeof(x)
語法你可能也會看到另一種語法:typeof(x)
。它與 typeof x
相同。
說清楚一點:typeof
是運算子,不是函式。這裡的括號不是 typeof
的一部分。這是用於數學分組的括號類型。
通常,此類括號包含數學表達式,例如 (2 + 2)
,但這裡它們只包含一個參數 (x)
。在語法上,它們允許避免 typeof
運算子與其參數之間的空格,有些人喜歡這樣。
有些人偏好 typeof(x)
,儘管 typeof x
語法更為常見。
摘要
JavaScript 中有 8 種基本資料類型。
- 七種原始資料類型
number
適用於任何類型的數字:整數或浮點數,整數受±(253-1)
限制。bigint
用於任意長度的整數。string
用於字串。字串可以有零個或多個字元,沒有單獨的單一字元類型。boolean
用於true
/false
。null
用於未知值,是一個單一值為null
的獨立類型。undefined
用於未指派值,是一個單一值為undefined
的獨立類型。symbol
用於唯一識別碼。
- 以及一個非原始資料類型
object
用於更複雜的資料結構。
typeof
算子讓我們可以看到變數中儲存的類型。
- 通常使用
typeof x
,但typeof(x)
也是可能的。 - 傳回一個字串,其中包含類型的名稱,例如
"string"
。 - 對於
null
,會傳回"object"
,這是語言中的錯誤,它實際上不是物件。
在後面的章節中,我們將專注於原始值,一旦我們熟悉它們,我們將繼續探討物件。
註解
<code>
標籤,對於多行,請將它們包裝在<pre>
標籤中,對於超過 10 行,請使用沙盒 (plnkr、jsbin、codepen…)