2022 年 11 月 1 日

資料類型

JavaScript 中的值永遠都是特定類型的。例如,字串或數字。

JavaScript 中有八種基本資料類型。我們將在此概略介紹這些類型,並在後續章節中詳細說明每種類型。

我們可以在變數中放入任何類型。例如,變數可以同時儲存字串和數字

// no error
let message = "hello";
message = 123456;

允許這樣做的程式語言(例如 JavaScript)稱為「動態類型」,表示存在資料類型,但變數不受任何類型約束。

數字

let n = 123;
n = 12.345;

數字類型同時表示整數和小數。

數字有許多運算,例如乘法 *、除法 /、加法 +、減法 - 等。

除了常規數字之外,還有屬於此資料類型的「特殊數字值」:Infinity-InfinityNaN

  • 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 ** 01)。

數學運算很安全

在 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 種類型的引號。

  1. 雙引號:"Hello"
  2. 單引號:'Hello'
  3. 反引號:`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 中,沒有這樣的類型。只有一個類型:字串。字串可能包含零個字元(為空)、一個字元或多個字元。

布林(邏輯類型)

布林類型只有兩個值:truefalse

此類型通常用於儲存是/否值: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)

最後三行可能需要額外的說明

  1. Math 是內建物件,提供數學運算。我們會在 數字 章節中學習它。在這裡,它只作為物件的範例。
  2. typeof null 的結果為 "object"。這是 typeof 中公認的錯誤,源自 JavaScript 的早期,並為了相容性而保留。null 絕對不是物件。它是一個具有自己獨立類型的特殊值。typeof 在此的行為是錯誤的。
  3. 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",這是語言中的錯誤,它實際上不是物件。

在後面的章節中,我們將專注於原始值,一旦我們熟悉它們,我們將繼續探討物件。

任務

重要性:5

腳本的輸出是什麼?

let name = "Ilya";

alert( `hello ${1}` ); // ?

alert( `hello ${"name"}` ); // ?

alert( `hello ${name}` ); // ?

反引號將 ${...} 內部的表達式嵌入到字串中。

let name = "Ilya";

// the expression is a number 1
alert( `hello ${1}` ); // hello 1

// the expression is a string "name"
alert( `hello ${"name"}` ); // hello name

// the expression is a variable, embed it
alert( `hello ${name}` ); // hello Ilya
教學課程地圖

註解

在評論之前閱讀這段內容…
  • 如果您有建議要改進,請 提交 GitHub 問題 或提交拉取請求,而不是評論。
  • 如果您無法理解文章中的某些內容,請詳細說明。
  • 要插入一些程式碼,請使用 <code> 標籤,對於多行,請將它們包裝在 <pre> 標籤中,對於超過 10 行,請使用沙盒 (plnkrjsbincodepen…)