現代 JavaScript 教程 — 重學數據類型

數據類型

JavaScript 中的變量能夠保存任何數據。變量在前一刻能夠是個字符串,下一刻就能夠變成 number 類型:javascript

// 沒有錯誤
let message = "hello";
message = 123456;
複製代碼

容許這種操做的編程語言稱爲「動態類型」(dynamically typed)的編程語言,意思是雖然編程語言中有不一樣的數據類型,可是你定義的變量並不會在定義後,被限制在某一數據類型。html

在 JavaScript 中有七種基本的數據類型。這一章咱們會學習數據類型的基本知識,在下一章咱們會對他們一一進行詳細講解。java

number 類型

let n = 123;
n = 12.345;
複製代碼

number 類型表明整數和浮點數。react

數字能夠有不少操做,好比,乘法 *、除法 /、加法 +、減法 - 等等。編程

除了常規的數字,還包括所謂的「特殊數值("special numeric values")」也屬於這種類型:Infinity-InfinityNaN安全

  • Infinity 表明數學概念中的 無窮大 ∞。是一個比任何數字都大的特殊值。微信

    咱們能夠經過除以 0 來獲得它:數據結構

    alert( 1 / 0 ); // Infinity
    複製代碼

    或者在代碼中直接使用它:編程語言

    alert( Infinity ); // Infinity
    複製代碼
  • NaN 表明一個計算錯誤。它是一個不正確的或者一個未定義的數學操做所獲得的結果,好比:函數

    alert( "not a number" / 2 ); // NaN,這樣的除法是錯誤的
    複製代碼

    NaN 是粘性的。任何對 NaN 的進一步操做都會返回 NaN

    alert( "not a number" / 2 + 5 ); // NaN
    複製代碼

    因此,若是在數學表達式中有一個 NaN,會被傳播到最終結果。

數學運算是安全的

在 JavaScript 中作數學運算是安全的。咱們能夠作任何事:除以 0,將非數字字符串視爲數字,等等。

腳本永遠不會由於一個致命的錯誤(「死亡」)而中止。最壞的狀況下,咱們會獲得 NaN 的結果。

特殊的數值屬於 "number" 類型。固然,對「特殊的數值」這個詞的通常認識是,它們並非數字。

咱們將在 數字類型 一節中學習數字的更多細節。

string 類型

JavaScript 中的字符串必須被括在引號裏。

let str = "Hello";
let str2 = 'Single quotes are ok too';
let phrase = `can embed ${str}`;
複製代碼

在 JavaScript 中,有三種包含字符串的方式。

  1. 雙引號:"Hello".
  2. 單引號:'Hello'.
  3. 反引號:`Hello`.

雙引號和單引號都是「簡單」引用,在 JavaScript 中二者並無什麼差異。

反引號是 功能擴展 引號。它們容許咱們經過將變量和表達式包裝在 ${…} 中,來將它們嵌入到字符串中。例如:

let name = "John";

// 嵌入一個變量
alert( `Hello, *!*${name}*/!*!` ); // Hello, John!

// 嵌入一個表達式
alert( `the result is *!*${1 + 2}*/!*` ); // the result is 3
複製代碼

${…} 內的表達式會被計算,計算結果會成爲字符串的一部分。能夠在 ${…} 內放置任何東西:諸如名爲 name 的變量,或者諸如 1 + 2 的算數表達式,或者其餘一些更復雜的。

須要注意的是,這僅僅在反引號內有效,其餘引號不容許這種嵌入。

alert( "the result is ${1 + 2}" ); // the result is ${1 + 2} (使用雙引號則不會計算 ${…} 中的內容)
複製代碼

咱們會在 字符串 一節中學習字符串的更多細節。

JavaScript 中沒有 character 類型。

在一些語言中,單個字符有一個特殊的 「character」 類型,在 C 語言和 Java 語言中是 char

在 JavaScript 中沒有這種類型。只有一種 string 類型,一個字符串能夠包含一個或多個字符。

boolean 類型(邏輯類型)

boolean 類型僅包含兩個值:truefalse

這種類型一般用於存儲表示 yes 或 no 的值:true 意味着 「yes,正確」,false 意味着 「no,不正確」。

好比:

let nameFieldChecked = true; // yes, name field is checked
let ageFieldChecked = false; // no, age field is not checked
複製代碼

布爾值也可做爲比較的結果:

let isGreater = 4 > 1;

alert( isGreater ); // true(比較的結果是 "yes")
複製代碼

更詳細的內容將會在 邏輯運算符 一節中介紹。

"null" 值

特殊的 null 值不屬於上述任何一種類型。

它構成了一個獨立的類型,只包含 null 值:

let age = null;
複製代碼

相比較於其餘編程語言,JavaScript 中的 null 不是一個「對不存在的 object 的引用」或者 「null 指針」。

JavaScript 中的 null 僅僅是一個表明「無」、「空」或「值未知」的特殊值。

上面的代碼表示,因爲某些緣由,age 是未知或空的。

"undefined" 值

特殊值 undefinednull 同樣自成類型。

undefined 的含義是 未被賦值

若是一個變量已被聲明,但未被賦值,那麼它的值就是 undefined

let x;

alert(x); // 彈出 "undefined"
複製代碼

原理上來講,能夠爲任何變量賦值爲 undefined

let x = 123;

x = undefined;

alert(x); // "undefined"
複製代碼

……可是不建議這樣作。一般,使用使用 null 將一個「空」或者「未知」的值寫入變量中,undefined 僅僅用於檢驗,例如查看變量是否被賦值或者其餘相似的操做。

object 類型和 symbol 類型

object 類型是一個特殊的類型。

其餘全部的數據類型都被稱爲「原生類型」,由於它們的值只包含一個單獨的內容(字符串、數字或者其餘)。相反,object 則用於儲存數據集合和更復雜的實體。在充分了解原生類型以後,咱們將會在 對象 一節中介紹 object

symbol 類型用於建立對象的惟一標識符。咱們在這裏提到 symbol 類型是爲了學習的完整性,但咱們會在學完 object 類型後再學習它。

typeof 運算符 [#type-typeof]

typeof 運算符返回參數的類型。當咱們想要分別處理不一樣類型值的時候,或者想快速進行數據類型檢驗時,很是有用。

它支持兩種語法形式:

  1. 做爲運算符:typeof x
  2. 函數形式:typeof(x)

換言之,有括號和沒有括號,運算結果是同樣的。

typeof x 的調用會以字符串的形式返回數據類型:

typeof undefined // "undefined"

typeof 0 // "number"

typeof true // "boolean"

typeof "foo" // "string"

typeof Symbol("id") // "symbol"

*!*
typeof Math // "object"  (1)
*/!*

*!*
typeof null // "object"  (2)
*/!*

*!*
typeof alert // "function"  (3)
*/!*
複製代碼

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

  1. Math 是一個提供數學運算的內建 object。咱們會在 info:number 一節中學習它。此處僅做爲一個 object 的示例。
  2. typeof null 的結果是 "object"。這實際上是不對的。官方也認可了這是 typeof 運算符的問題,如今只是爲了兼容性而保留了下來。固然,null 不是一個 objectnull 有本身的類型,它是一個特殊值。再次強調,這是 JavaScript 語言的一個錯誤。
  3. typeof alert 的結果是 "function",由於 alert 在 JavaScript 語言中是一個函數。咱們會在下一章學習函數,那時咱們會了解到,在 JavaScript 語言中沒有一個特別的 "function" 類型。函數隸屬於 object 類型。可是 typeof 會對函數區分對待。這不是很正確的作法,但在實際編程中很是方便。

總結

JavaScript 中有七種基本的數據類型(譯註:前六種爲基本數據類型,也屬於原生類型,而 object 爲複雜數據類型)。

  • number 用於任何類型的數字:整數或浮點數。
  • string 用於字符串:一個字符串能夠包含一個或多個字符,因此沒有單獨的單字符類型。
  • boolean 用於 truefalse
  • null 用於未知的值 —— 只有一個 null 值的獨立類型。
  • undefined 用於未定義的值 —— 只有一個 undefined 值的獨立類型。
  • symbol 用於惟一的標識符。
  • object 用於更復雜的數據結構。

咱們能夠經過 typeof 運算符查看存儲在變量中的數據類型。

  • 兩種形式:typeof x 或者 typeof(x)
  • 以字符串的形式返回類型名稱,例如 "string"
  • typeof null 會返回 "object" —— 這是 JavaScript 編程語言的一個錯誤,實際上它並非一個 object

在接下來的章節中,咱們將重點介紹原生類型值,當你掌握了原生數據類型後,咱們將繼續學習 object

做業題

先本身作題目再看答案。

字符串的引號

重要程度:⭐️⭐️

下面的腳本會輸出什麼?

let name = "Ilya";

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

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

alert( `hello ${name}` ); // ?
複製代碼

答案

反引號將包裝在 ${...} 中的表達式嵌入到了字符串。

let name = "Ilya";

// 表達式爲數字 1
alert( `hello ${1}` ); // hello 1

// 表達式是一個字符串 "name"
alert( `hello ${"name"}` ); // hello name

// 表達式是一個變量,嵌入進去了。
alert( `hello ${name}` ); // hello Ilya
複製代碼

現代 JavaScript 教程:開源的現代 JavaScript 從入門到進階的優質教程。React 官方文檔推薦,與 MDN 並列的 JavaScript 學習教程

在線免費閱讀:zh.javascript.info/


掃描下方二維碼,關注微信公衆號「技術漫談」,訂閱更多精彩內容。

相關文章
相關標籤/搜索