Number、parseIn和parseFloat 區別

原文轉自:

https://www.w3cmm.com/javascript/number-parseint-parsefloat.html

有3個函數可以把非數值轉化成數值:Number()、parseInt()和parseFloat()。第一個函數,即轉型函數Number()可以用於任何數據類型,而另兩個函數則專門用於把字符串轉換成數值。這個3個函數對於同樣的輸入會有不同的結果。

  • Number()函數的轉換規則如下:
  • 如果是Boolean值,true和false將分別被轉換爲1和0
  • 如果是是數字值,只是簡單的傳入和返回:
  • 如果是null值,返回0;
  • 如果是undefined,返回NaN;
  • 如果是字符串,遵循下列規則:
  • 如果字符串中只包含數字,則將其轉換爲十進制數值,級“1”會變成1,“123”會變成123,而“011”會變成11(前面的0被忽略了)
    1. 如果字符串中只包含有效的浮點格式,如“1.1”,則將其轉換爲對應浮點數值(同樣,也會忽略前導零)
    2. 如果字符串中只包含有效的十六進制格式,例如“0xf”,則將其轉換爲相同大小的十進制整數值;
    3. 如果字符串是空的(不包含任何字符),則將其轉換爲0;
    4. 如果字符串中包含除上述格式之外的字符,則將其轉換爲NaN。
  • 如果是對象,則調用對象的valueOf()方法,然後依照前面的規則轉換返回的值。如果轉換的結果是NaN,則調用對象的toString()把各種數據類型轉換爲數值確實有點複雜。下面是幾個具體例子:
var num1 = Number("Hello world!"); //NaN
var num2 = Number(""); //0
var num3 = Number("000011"); //11
var num4 = Number("true"); //1

首先,字符串“Hello world!”會被轉換爲NaN,因爲其中不包含任何有意義的數字值。空字符串會被轉換爲0。字符串“000011”會被轉換爲11,因爲忽略了前導零。最後,true值被轉換爲1。

由於Number()函數在轉換字符串時比較複雜而且不夠合理,因此在處理整數的時候更常用的是parseInt()函數。parseInt()函數在轉換字符串時,更多的是看其是否符合數值模式。它會忽略字符串前面的空格,直至找到第一個非空格字符。如果第一個字符不是數字字符或者負號,parseInt()就會返回NaN;也就是說,用parseInt()轉換空字符串會返回NaN(Number()對空字符串返回0)。如果第一個字符是數字字符,parseInt()會繼續解析第二個字符,直到解析完所有後續字符或者遇到了一個非數字字符。例如,“123blue”會被轉換爲1234,因爲“blue”會被完全忽略。類似地,“22.5”會被轉換成22,因爲小數點並不是有效的數字字符。

如果字符串中的第一個字符是數字字符,parseInt()也能夠識別出各種整數格式(即十進制、八進制、十六進制)。也就是說,如果字符串以“0x”開頭且後跟數字字符,就會將其當作一個十六進制整數;如果字符串以“0”開頭且後跟數字字符,則將其當作一個八進制數來解析。

爲了更好地理解parseInt()函數的轉換規則,下面給出了一些例子:

var num1 = parseInt("1234blue"); //1234
var num2 = parseInt(""); //NaN
var num3 = parseInt("0xA") //10(十六進制)
var num4 = parseInt("22.5"); //22
var num5 = parseInt("070"); //56(八進制)
var num6 = parseInt("70"); //(70)十進制
var num7 = parseInt("0xF") //15(十六進制)

理解這幾個例子時,最關鍵的是要注意parseInt()解析“070”和“70”的不同方式。此時“070”中的前導零表示這是一個八進制(而非十進制)格式的字符串,因此結果是56(注意這個結果與調用Number()函數不同)。而“70”,由於沒有前導零,因此就被轉換成了70。爲了消除在使用parseInt()函數時可能導致的上述困惑,ECMAScript也爲這個函數提供了第二個參數:轉換時使用的基數(即多少進制)。

如果要知道要解析的值是十六進制格式的字符串,那麼指定基數16作爲第二個參數,可以保證得到正確的結果,例如:

var num = parseInt("0xAF", 16); //175

實際上,如果指定了16作爲第二個參數,字符串可以不帶前面的“0x”,如下所示:

var num1 = parseInt("AF", 16); //175
var num2 = parseInt("AF"); //NaN

這個例子中的第一個轉換成功了,而第二個則失敗了。差別在於第一個轉換傳入了基數,明確告訴parseInt()要解析一個十六進制格式的字符串;而第二個轉換髮現第一個字符不是數字字符,因此就自動終止了。

指定基數會影響到轉換的輸出結果。例如:

var num1 = parseInt("10", 2); //2
var num2 = parseInt("10", 8);  //8
var num3 = parseInt("10", 10); //10
var num4 = parseInt("10", 16); //16

由於不指定基數則意味着讓parseInt()決定如何解析輸入的字符串,因此爲了避免錯誤的解析,我們建議無論在什麼情況下都明確指定基數——特別是在像下面這樣處理八進制的情況下:

var num1 = parseInt("010"); //8
var num2 = parseInt("010", 8); //8
var num3 = parseInt("010", 10); //10

在這個例子中,“010”會因爲第二個參數不同而被轉換成不同的值。第一行的轉換很直觀,即讓parseInt()決定如何轉換。由於第一個字符是“0”而後面也是數字字符,因而parseInt()假設它是一個八進制數。實際上,parseInt()的這個默認行爲域第二行轉換中明確了基數行爲是一致的。第三行傳入基數10,因此parseInt()就會忽略字符串中的前導零,而只解析其餘的數字符。

多數情況下,我們要解析的都是十進制數值,因此始終將10作爲第二個參數是非常必要的。

與parseInt()函數類似,parseFloat()也是從第一個字符(位置0)開始解析每個字符。而且也是一直解析到字符串末尾,或者解析到遇見一個無效的浮點數字字符爲止。也就是說,字符串中的第一個小數點是有效的,而第二個小數點是無效的,因此它後面的字符串將被忽略。舉例來說,“22.34.5”將會被轉換爲22.34。

除了第一個小數點有效之外,parseFloat()與parseInt()的第二個區別在於它始終都會忽略前導零。parseFloat()可以識別前面討論過的所有浮點數值格式,也包括十進制整數格式。但十六進制格式的字符串始終會被轉換爲0。由於parseFloat()只解析十進制值,因此它沒有用第二個參數指定基數的用法。最後還要注意一點:如果字符串包含的是一個可解析爲整數的數(沒有小數點,或者小數點後面都是零),parseFloat()會返回整數。以下是使用parseFloat()轉換數值的幾個典型示例:

var num1 = parseFloat("1234blue"); //1234
var num2 = parseFloat("0xA"); //0
var num3 = parseFloat("22.5"); //22.5
var num4 = parseFloat("22.34.5"); //22.34
var num5 = parseFloat("0908.5"); //908.5
var num6 = parseFloat("3.125e7"); //31250000

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章