JavaScript 中的變量能夠保存任何數據。變量在前一刻能夠是個字符串,下一刻就能夠變成 number 類型:javascript
// 沒有錯誤
let message = "hello";
message = 123456;
複製代碼
容許這種操做的編程語言稱爲「動態類型」(dynamically typed)的編程語言,意思是雖然編程語言中有不一樣的數據類型,可是你定義的變量並不會在定義後,被限制在某一數據類型。html
在 JavaScript 中有七種基本的數據類型。這一章咱們會學習數據類型的基本知識,在下一章咱們會對他們一一進行詳細講解。java
let n = 123;
n = 12.345;
複製代碼
number 類型表明整數和浮點數。react
數字能夠有不少操做,好比,乘法 *
、除法 /
、加法 +
、減法 -
等等。編程
除了常規的數字,還包括所謂的「特殊數值("special numeric values")」也屬於這種類型:Infinity
、-Infinity
和 NaN
。安全
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" 類型。固然,對「特殊的數值」這個詞的通常認識是,它們並非數字。
咱們將在 數字類型 一節中學習數字的更多細節。
JavaScript 中的字符串必須被括在引號裏。
let str = "Hello";
let str2 = 'Single quotes are ok too';
let phrase = `can embed ${str}`;
複製代碼
在 JavaScript 中,有三種包含字符串的方式。
"Hello"
.'Hello'
.`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 類型僅包含兩個值:true
和 false
。
這種類型一般用於存儲表示 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
值:
let age = null;
複製代碼
相比較於其餘編程語言,JavaScript 中的 null
不是一個「對不存在的 object
的引用」或者 「null 指針」。
JavaScript 中的 null
僅僅是一個表明「無」、「空」或「值未知」的特殊值。
上面的代碼表示,因爲某些緣由,age
是未知或空的。
特殊值 undefined
和 null
同樣自成類型。
undefined
的含義是 未被賦值
。
若是一個變量已被聲明,但未被賦值,那麼它的值就是 undefined
:
let x;
alert(x); // 彈出 "undefined"
複製代碼
原理上來講,能夠爲任何變量賦值爲 undefined
:
let x = 123;
x = undefined;
alert(x); // "undefined"
複製代碼
……可是不建議這樣作。一般,使用使用 null
將一個「空」或者「未知」的值寫入變量中,undefined
僅僅用於檢驗,例如查看變量是否被賦值或者其餘相似的操做。
object
類型是一個特殊的類型。
其餘全部的數據類型都被稱爲「原生類型」,由於它們的值只包含一個單獨的內容(字符串、數字或者其餘)。相反,object
則用於儲存數據集合和更復雜的實體。在充分了解原生類型以後,咱們將會在 對象 一節中介紹 object
。
symbol
類型用於建立對象的惟一標識符。咱們在這裏提到 symbol
類型是爲了學習的完整性,但咱們會在學完 object
類型後再學習它。
typeof
運算符返回參數的類型。當咱們想要分別處理不一樣類型值的時候,或者想快速進行數據類型檢驗時,很是有用。
它支持兩種語法形式:
typeof x
。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)
*/!*
複製代碼
最後三行可能須要額外的說明:
Math
是一個提供數學運算的內建 object
。咱們會在 info:number 一節中學習它。此處僅做爲一個 object
的示例。typeof null
的結果是 "object"
。這實際上是不對的。官方也認可了這是 typeof
運算符的問題,如今只是爲了兼容性而保留了下來。固然,null
不是一個 object
。null
有本身的類型,它是一個特殊值。再次強調,這是 JavaScript 語言的一個錯誤。typeof alert
的結果是 "function"
,由於 alert
在 JavaScript 語言中是一個函數。咱們會在下一章學習函數,那時咱們會了解到,在 JavaScript 語言中沒有一個特別的 "function" 類型。函數隸屬於 object
類型。可是 typeof
會對函數區分對待。這不是很正確的作法,但在實際編程中很是方便。JavaScript 中有七種基本的數據類型(譯註:前六種爲基本數據類型,也屬於原生類型,而 object
爲複雜數據類型)。
number
用於任何類型的數字:整數或浮點數。string
用於字符串:一個字符串能夠包含一個或多個字符,因此沒有單獨的單字符類型。boolean
用於 true
和 false
。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/
掃描下方二維碼,關注微信公衆號「技術漫談」,訂閱更多精彩內容。