javascript的數據類型大致上分兩種:基本類型和對象類型。簡單的區分就是基本類型是沒法再分的原子級類型;對象類型是容器,能夠容納基本類型和對象類型。javascript
javascript的在基本類型劃分上,秉持最小化的原則:java
學習一門語言的數據類型必須區分兩個概念:學習
本篇文章不打算搞什麼繞腦筋的高深玩意,只打算把基本類型的分類和相應的字面量分清楚就夠了,已經基礎的不能再基礎了吧。固然了,光說不練假把式,一堆堆的assert測試用例那是必須地。測試
javascript是一門動態語言,變量聲明後沒有任何類型信息,必須靠運行時進行判斷,所以須要有一種手段來檢測給定變量的數據類型,這就是typeof操做符的用意。this
在需求上咱們但願能夠經過typeof來區分5種基本類型,即:spa
實際上javascript的typeof也偏偏就是這麼設計的。設計
儘管javascript中的一切number本質上都是浮點數,可是做爲字面量仍是要區分整數和浮點數的。指針
整數的測試組:code
test("整數字面量", function() { // 標準的0 // 至於+0,-0,其實基本用不上,權當好玩吧 assert(0 === 0, "0"); assert(+0 === 0, "+0"); assert(-0 === 0, "-0"); // 正整數,注意進制 assert(+12 === 12, "正整數十進制"); assert(+012 === 10, "正整數八進制"); assert(+0x12 === 18, "正整數十六進制"); // 負整數,注意進制 assert(-12 === -12, "負整數十進制"); assert(-012 === -10, "負整數八進制"); assert(-0x12 === -18, "負整數十六進制"); });
浮點數的測試組:對象
test("浮點數字面量", function() { // 這玩意也是0 assert(0.00000 === 0, "0"); assert(+0.00000 === 0, "+0"); assert(-0.00000 === 0, "+0"); // 正浮點數數,注意科學計數法 assert(3.14 === 3.14, "正浮點數"); assert(3.14e1 === 31.4, "正浮點數"); // 正浮點數數,注意科學計數法 assert(-3.14 === -3.14, "負浮點數"); assert(-3.14e1 === -31.4, "負浮點數"); // 由於浮點數精度的問題,通常是不能直接比較的, // 對於javascript的浮點能夠直接比較的問題, // 我只能歸結爲當字面量轉換爲浮點數格式後,其二進制內容恰巧一致吧 assert(3.14 !== 3.1400000000000000000001, "浮點數比較,不管放多少個0,其實也是不相等的"); // 不推薦的字面量寫法 // 都什麼年代了,不是計算機內存極端匱乏了時候了, // 不用爲代碼中省了0而斤斤計較了 assert(.42 === 0.42, ".42不推薦"); assert(42. === 42.0, "42.不推薦"); });
補充幾點:
Javascript的Number中還有一些特殊的數:
test("特殊數字", function() { // 正無窮,實際上是表示比Number.MAX_VALUE還大, // 和高數中的正無窮是兩碼事,因此是能夠比較的 assert(Infinity === Infinity, "Infinity"); // 負無窮,實際上是表示比Number.MIN_VALUE還小, // 和高數中的負無窮是兩碼事,因此是能夠比較的 assert(-Infinity === -Infinity, "-Infinity"); // NaN(not a number)卻仍是一個number類型,這個有點繞, // 可是更繞的是這傢伙本身既然不等於本身, // 好吧,這傢伙是生活在另一個宇宙空間裏的 assert(NaN !== NaN, "NaN"); });
javascript中的string類型底層是用16位Unicode字符表示的,因此天然支持中文了。想一想也是,在網頁上用的,你敢不支持unicode?誰還敢用你?
test("字符串字面量", function() { assert("abc" === "abc", "'abc'"); assert('abc' !== "Abc", "'abc'"); });
按照慣例,字符串還支持轉義字符:
test("轉義字符", function() { assert("\n" === "\n", "換行"); assert("\t" === "\t", "製表"); assert("\b" === "\b", "空格"); assert("\r" === "\r", "回車"); assert("\f" === "\f", "進紙"); assert("\\" === "\\", "斜槓"); assert("\'" === "\'", "單引號"); assert("\"" === "\"", "雙引號"); assert("\x41" === "A", "以十六進制代碼nn表示的一個字符(其中n爲0~F)"); assert("\u03a3" === "Σ", "以十六進制代碼nnnn表示的一個Unicode字符(其中n爲0~F)"); });
補充幾點:
只有兩個值true和false。
test("字面量", function() { assert(true, "true"); assert(!false, "false"); });
只有一個值null。
test("字面量", function() { var obj = null; assert(obj === null, "null"); });
只有一個值undefined。
test("undefined和變量", function() { // 聲明未賦值默認爲undefined var p; assert(p === undefined, "var p"); // 未聲明變量不能直接使用 // assert(q === undefined, "q"); // 未聲明未賦值的成員變量,會被自動聲明和添加 assert(this.x === undefined, "this.x"); });
應區未定義和爲聲明的區別:
test("undeclared", function() { if (typeof DEBUG == "undefined") { assert(true, "undeclared DEBUG"); } var DEBUG; if (typeof DEBUG == "undefined") { assert(true, "declared DEBUG"); } });