parseInt(string, radix) 有2個參數,第一個string 是傳入的數值,第二個radix是傳入數值的進制,參數radix 可以忽略,預設為10,各種進制的數轉換為十進制整數(如果不是整數,向下取整)。
radix 的值範圍是 2~36,如果 radix 為 1 或 radix>36 ,轉換結果將是 NaN ,如果 radix 為 0 或其它值將被忽略,radix 默認為 10 。
該函數要求第一個參數是字串,如果不是字串將被轉換成字串,而且,在進行轉換之前,字串參數的左側符合進制數所使用字元集的字元被截取出來用於進制數的轉換。
字串參數開頭和結尾的空格會被忽略。
parseInt(param,radix) 相當於parseInt(String(param).trim(),radix)
例如, parseInt(010) // 8,處理過程是
010 --> 8 //0 開頭,八進位數
8 --> '8'
parseInt('8') //忽略radix ,傳入的第一個參數被辨識為10進位數
parseInt(0x10) // parseInt(16) 得到十進位16
parseInt(010,16) // par ('8',16) ,得到8
parseInt(010,7) // parseInt('8',7) , 8 超出7 進位數所使用字元的範圍被丟棄,轉換結果為NaN
parseInt(0x10,8) // parseInt('16',8) 得到14
parseInt(0x13,8) // parseInt('19',8) 字元9 超出了8進位數所使用字元的範圍,被丟棄,轉換結果為1
如果第一個參數直接傳入字串,忽略radix ,則:
字串以0 開頭,預設被辨識為8 進位( IE 9辨識為10進制,ie 6-8 辨識為8 進位)
字串以0x 開頭,預設被辨識為16 進位
否則辨識為10進位
parseInt('010') //8 ,ie9 得到10
parseInt('018' ) //1 ,ie9 得到18
parseInt('017') //15 , ,ie9 得到15
parseInt('010',8) //直接辨識為8進制,轉換結果8
parseInt('010',7) //直接辨識為7進制,轉換結果7
parseInt('010',16) //直接辨識為16進制,轉換結果16
parseInt(' 0x10') //16
parseInt('0x1g') //1
parseInt('0x1f') //31
parseInt('0x10',8) //直接辨識為8進位,字元x 超出8進位數所使用字元的範圍,轉換結果0
parseInt('0x10',15) // 轉換結果0
parseInt('0x10',16) // 0x 符合16進位數的表達格式,正確辨識為16 進制數,轉換結果同parseInt('10',16) 為16
parseInt('0x10',17) // 辨識為17進制,字元x 超出17進位數所使用字元的範圍,轉換結果0
parseInt(true) //NaN ,注意區別布林型在Number 函數中的用法, Number(true) //1
需要特別注意的
1/0 // Infinity
Infinity.toString() // 'Infinity'
於是,坑爹的來了:
parseInt(1/0,18) // NaN
parseInt(1/0,19) //18
因為字元i 在19 進位數使用的字元集內,字元n 及後面的被丟棄
parseInt(1/0,19) 實際為parseInt('i',19)
另外還有
parseInt(NaN,36)Int // 30191
因為字元n 在36 進位中相當於十進位23,a 相當於十進位10,於是有
23*36*36 10*36 23 = 30191
parseInt(1/0,36) // 1461559270678 ,實為parseInt('Infinity',36)
parseFloat 是沒有進位參數的,只能處理10進位數。
parseFloat.length //1