重學前端系列-Javascript數據類型

類型

一共包括下面七種數據類型面試

  • String
  • Number
  • Boolean
  • Null
  • Undefined
  • Symbol
  • Object

Undefined、Null

Undefined 類型表示未定義,它的類型只有一個值,就是undefined。通常使用void 0 來獲取一個undefined的值。數組

Null 類型也只有一個值,就是 null,它的語義表示定義了可是爲空值.而且null是Javascript的一個關鍵字。因此通常不會把變量賦值爲undefined,這樣能夠保證全部值爲undefined的變量,都是從未賦值的天然狀態bash

Boolean

Boolean有兩個值true和false,表示邏輯意義上的真和假。函數

String

字符串的最大長度爲2^53-1,Javascript中的字符串是永遠沒法變動的。一旦字符串建立出來沒法用任何方式改變字符串的內容,因此字符串具備值類型的特徵。ui

Number

Javascript的Number類型基本符合雙精度浮點數規則。而且引入了幾個特殊的狀況:spa

  • NaN (Not a Number) 非數字
  • Infinity 正無窮大
  • -Infinity 負無窮大

Javascript的+0和-0的檢測能夠經過1/x 是Infinity或者-Infinity來進行區分。 根據浮點數的定義,非整數的Number類型沒法用==來比較。prototype

經典的面試題: 在Javascript中,爲何0.1+0.2!=0.3 ? (這個面試題錯誤的不是結論,而是比較的方法,這個題裏面涉及到雙精度浮點小數部分轉化爲2進制計算的過程當中舍掉精度而形成值不許致使,正確的比較方法以下:)code

// 絕對值小於最小精度
    console.log( Math.abs(0.1 + 0.2 - 0.3) <= Number.EPSILON);
複製代碼

Symbol

Symbol能夠具備字符串類型的描述,即便描述相同,Symbol也不相等。cdn

var mySymbol = Symbol("my symbol");
複製代碼

可使用Symbol.iterator來自定義for..of在對象上的行爲。對象

var o = new Object

    o[Symbol.iterator] = function() {
        var v = 0
        return {
            next: function() {
                return { value: v++, done: v > 10 }
            }
        }        
    };

    for(var v of o) 
        console.log(v); // 0 1 2 3 ... 9

複製代碼

類型轉換

當使用==的時候會進行類型轉換。

StringToNumber

  • parseInt(string,進制) 通常建議傳入第二個參數
  • parseFloat 會直接把字符串當作十進制來解析
  • 多數狀況下Number轉化是最好的選擇。

裝箱轉換

每一種基本數據類型String、Number、Boolean、Symbol在對象中都有相對應的類。所謂裝箱轉換就是把基本數據類型轉換爲對應的對象。

Object.prototype.toString.call能夠準確的識別對象對應的基本類型。可是須要注意的是call自己會產生裝箱操做。因此須要配合typeof來區分基本數據類型仍是對象類型。

拆箱轉換

Javascript標準中規定了ToPrimitive函數,它是對象類型到基本數據類型的轉換。而且對象內部有valueOf和toString方法。當對對象進行不一樣的拆箱的時候調用順序會有所不一樣。(還須要注意一個點就是當對象做爲數組arr的變量取值的時候arr[obj]是先調用obj的toString的)

// valueOf 和 toString必須返回原始值 不然繼續向下執行  最終拋出錯誤
    var o = {
        valueOf : () => {console.log("valueOf"); return {}},
        toString : () => {console.log("toString"); return {}}
    }

    o * 2
    // valueOf
    // toString
    // TypeError
    
    
    // 先toString後valueOf
    var o = {
        valueOf : () => {console.log("valueOf"); return {}},
        toString : () => {console.log("toString"); return {}}
    }

   String(o)
    // toString
    // valueOf
    // TypeError
    
    
    // Symbol.toPrimitive的優先級最高
    var o = {
        valueOf : () => {console.log("valueOf"); return {}},
        toString : () => {console.log("toString"); return {}}
    }

    o[Symbol.toPrimitive] = () => {console.log("toPrimitive"); return "hello"}


    console.log(o + "") // 若是沒有Symbol.toPrimitive,其實這個也是先調valueOf 而後再是toString
    // toPrimitive
    // hello

複製代碼

看下加法運算符的規範:

相關文章
相關標籤/搜索