javascript學習-基本類型

javascript學習-基本類型

1.概述

javascript的數據類型大致上分兩種:基本類型和對象類型。簡單的區分就是基本類型是沒法再分的原子級類型;對象類型是容器,能夠容納基本類型和對象類型。javascript

javascript的在基本類型劃分上,秉持最小化的原則:java

  1. number類型表示數據(無論什麼整數,浮點數,有符號,無符號的,都不須要區分了,只有一種數字)
  2. string類型表示字符串(還要什麼字符,都有字符串了,還要那玩意幹嘛?)
  3. boolean類型表示布爾(只有true和false,整個類型就這兩個就夠了)
  4. null類型表示空(估計是從C/C++語言和java語言中的null指針借鑑過來的,就表示空值,整個類型只有一個值null)
  5. undefined類型表示聲明瞭卻未定義的特殊狀況(整個類型只有一個值undefined)

學習一門語言的數據類型必須區分兩個概念:學習

  • 變量,相似於代數中的x,y,z,在計算機語言中表明一個具體的存儲空間地址,可被賦值
  • 字面量,相似於代數中的1,2,3,在計算機語言中表明直接寫在代碼中的數據,不可被賦值

本篇文章不打算搞什麼繞腦筋的高深玩意,只打算把基本類型的分類和相應的字面量分清楚就夠了,已經基礎的不能再基礎了吧。固然了,光說不練假把式,一堆堆的assert測試用例那是必須地。測試

2.typeof

javascript是一門動態語言,變量聲明後沒有任何類型信息,必須靠運行時進行判斷,所以須要有一種手段來檢測給定變量的數據類型,這就是typeof操做符的用意。this

在需求上咱們但願能夠經過typeof來區分5種基本類型,即:spa

  1. typeof number === "number"
  2. typeof string === "string"
  3. typeof boolean=== "boolean"
  4. typeof null=== "null"
  5. typeof undefined === "undefined"

實際上javascript的typeof也偏偏就是這麼設計的。設計

2.number

儘管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.不推薦");
            });

補充幾點:

  • 浮點數值的最高精度是17位小數,採用標準的雙精度浮點數格式存儲
  • 在默認狀況下,ECMASctipt 會將那些小數點後面帶有6 個零以上的浮點數值轉換爲以e 表示法表示的數值(例如,0.0000003 會被轉換成3e-7)

Javascript的Number中還有一些特殊的數:

  • Infinity,表示因爲內存的限制,超出了JavaScript數值範圍的值,可是它仍然是number
  • NaN,表示一個原本要返回數值的操做數未返回數值的狀況(這樣就不會拋出錯誤了)
            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");
            });

3.string

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)");
            });

補充幾點:

  • javascript的字符串是不可變的

4.boolean

只有兩個值true和false。

            test("字面量", function() {
                assert(true, "true");
                assert(!false, "false");
            });

5.null

只有一個值null。

            test("字面量", function() {
                var obj = null;
                assert(obj === null, "null");
            });

6.undefined

只有一個值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");
                }
            });
相關文章
相關標籤/搜索