文章來自:https://www.cnblogs.com/breezeljm/p/6138763.html
1、parseInt函數
定義:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/parseInt
語法:parseInt(string [ , radix])
參數:
string:要被解析的值。如果參數不是一個字符串,則將其轉換為字符串。字符串開頭的空白符將會被忽略。
radix:一個2到36之間的整數值,用於指定轉換中采用的基數。
如果省略該參數或者為0,則數字將以 10 為基礎來解析。
如果string以 “0x” 或 “0X” 開頭,將以 16 為基數。
如果string以“0” 開頭,在ECMA3中被認為是8進制;但是在ECMA5中已經強制規定此情況默認是10進制
如果該參數小於 2 或者大於 36,則 parseInt() 將返回 NaN。
在ECMA規范中,對於parseInt函數解析字符串為數字的步驟如下:


看看V8中parseInt函數的源碼:【只列出一部分,如需要查看請參見V8中src/conversions-inl.h和src/compiler/js-builtin-reducer.cc】
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
if
(radix == 0) {
//如果傳入radix是0,則以10進行處理
// Radix detection.
radix = 10;
if
(*current ==
'0'
) {
++current;
if
(current == end)
return
SignedZero(negative);
if
(*current ==
'x'
|| *current ==
'X'
) {
radix = 16;
++current;
if
(current == end)
return
JunkStringValue();
}
else
{
leading_zero =
true
;
}
}
}
else
if
(radix == 16) {
//16進制
if
(*current ==
'0'
) {
// Allow "0x" prefix.
++current;
if
(current == end)
return
SignedZero(negative);
if
(*current ==
'x'
|| *current ==
'X'
) {
++current;
if
(current == end)
return
JunkStringValue();
}
else
{
leading_zero =
true
;
}
}
}
if
(radix < 2 || radix > 36)
return
JunkStringValue();
//radix不在2~36之間的處理
|
例如解析:
parseInt('0101' , 1) => NaN
parseInt('453' , 2) => NaN 因為453不符合二進制數字,所以無法轉換出正確的數字
2、Number()函數
定義:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number
計算步驟:


兩種方法的區別:
參考鏈接:http://www.w3school.com.cn/js/pro_js_typeconversion.asp

用 Number() 進行強制類型轉換,並且是轉換整個字符串值,如果整個字符串不能轉換成數字,則輸出NaN。
例如:
parseInt('01a02', 10) => 1 parseInt('1.22.22', 10) => 1 parseInt('1.22' , 10) => 1
Number('01a02') => NaN Number('1.22.22') => NaN Number('1.22') => 1.22
JS中數字利用parseInt進行轉換成整數:
由parseInt中定義:parseInt是用於將字符串根據基數轉換成整數,如果傳入參數不是字符串,會首先利用toString方法轉換為字符串,再轉換為整數
例子:
parseInt(0.000001) => 0 parseInt('0.000001') => 0
parseInt(0.0000001) => 1 parseInt('0.0000001') => 0
轉換0.000001和0.0000001數字時出現結果不同,那么先將看看這兩個數字轉換為字符串的結果:
var a = 0.000001 ; a.toString() ; => '0.000001'
var b = 0.0000001 ; b.toString() ; => '1e-7'
由此不難看出:為什么會出現上述結果。
究其原因:在ECMA規范中

可以解釋0.000001和0.0000001轉換為字符串后的不同結果。
所以在日常使用parseInt函數時:常用的情況無非為將字符串轉換為整數或者將數字轉換為整數,所以在使用將數字轉換為整數時,最好需要進行判斷
