JS 轉換資料為數位方法有三類五種,包括:
•強制轉換,JS 的基礎資料型別 (Elementary Data Type)都這以這樣轉換成對應的類型(Number(v))
•原生函數,這兩個函數有不一樣的結果(parseInt(v,radix)、parseFloat(v))
•隱式轉換,在執行的時候 JS 會轉換變數為對應類型(位計算,數學計算)
轉換的原值也可以簡單分為三類:對象、特殊值、字串。
JS 中的特殊值包括以下幾個。
•undefined,未定義,當變數聲明但沒賦值或者一個對象不存在的屬性的值就是這個了。
•NaN/Infinity,這是兩個頑固的“數字”(typeof == number),分別表示非數字和無限大的數。貌似沒什麼用,轉換成數字失敗的話,傳回值基本是NaN。
•null,當成零值用的對象(typeof == object)。
•true/false,布爾值,表示真、假,等價於1/0。
對於字串,根據內容還可以進行細分。根據 JS 數字運算式,可以分為合法和非法。合法的數字有幾種不同的分類方法:
•符號:正號、負號、無符號
•進位:八進位、十進位、十六進位
•科學記號標記法
•小數、整數,以及小數的簡寫
根據上面的分類,我製作了一個 Demo,用來測試不同方法、數值轉換後的結果。下面的是在 chrome 下的轉換。
看結果只有位計算能把任何值轉換為有限數(isFinite),數學計算和強制轉換的結果是一樣的。
特殊值的轉換和原值以及轉換方法都有關係。parseInt/parseFloat 全部轉換失敗,返回 NaN。
•NaN/undefined 用其它方法全轉換成 NaN;
•Infinity 被 parseInt 轉換成 NaN,剩下的方法不改變它的值;
•null/false/true 不能被 parseInt/parseFloat 轉換,返回 NaN。
對字串的轉換剖析主要看轉換方法,但全部方法都不支援八進位表示的數字,而是當成對應的十進位數。
•邏輯計算轉換除負十六進位數外的合法運算式,並捨去小數部分;不合法的運算式返回零。
•數學計算/Number 和邏輯計算類似,但不捨去小數;除Null 字元串外的不合法運算式返回 NaN。
•parseInt 也是只保留整數部分;但是對不合法的運算式,取字串前面合法的整數(十進位、十六進位,不包括科學記號標記法)部分轉換,沒有則返回 NaN。
•parseFloat 和 parseInt 類似,不同的是能識別並保留小數部分,並且不支援十六進位數。