三者的作用:把其他数据类型转换成数字
区别:Number()
可以用于任何数据类型转换成数值;parseInt()
用于将字符串转换成数值
parseInt()
和parseFloat()
这两者的区别就是整数
和浮点数
的区别,所以本文将只比较Number()
和parseInt()
一、Number()
-
Boolean值,true 转换成 1, false 转换成 0;
-
null,返回0;
-
undefined, 返回NaN;
-
如果是字符串:
-
字符串只包含数据时,将转换成十进制的数值,第一个数字是0的话,将会忽略,如:
Number('0123') -> 123
; -
字符串包含有效的浮点数,如“1.1”,将转换成对应的浮点数,如:
Number('01.1') -> 1.1
; -
字符串包含有效的十六进制格式,如“0xf”,将转换成相同大小的十进制数值,如:
Number('0xf') -> 15
; -
字符串为空,转换成0,如:
Number('') -> 0
; -
字符串包含了除上面这几种格式外的字符,将转换成
NaN
,如:Number('123x') -> NaN
-
-
如果是对象,则调用对象的ValueOf()方法,然后依照前面的规则转换返回的值;如果转换的结果是NaN,则调用的对象的toString()方法,然后再次依照前面的规则转换返回的字符串值。
二、parseInt()
只能将字符串转换成数值;与 Number()
转字符串的区别是:
-
字符串数字开头或者负号开头,往后取值,直到非数字停止,如:
parseInt('123x') -> 123
、parseInt('-023x') -> -23
,注意:parseInt('-0a') -> -0
、parseInt('-0x') -> NaN
(0x为十六进制数的开头)、parseInt('-abc') -> NaN
; -
字符串非数字或者负号开头,则为
NaN
,如:parseInt('x123') -> NaN
; -
空字符串,返回
NaN
, 如:parseInt('') -> NaN
; -
parseInt('1.1') -> 1
这也是它和 parseFloat() 的差别。
Number() 和 parseInt() 对比的一张表
值 | Number() | parseInt() |
---|---|---|
'' | 0 | NaN |
true/false | 1/0 | NaN |
'0123' | 123 | 123 |
'123x' | NaN | 123 |
'x123' | NaN | NaN |
'01.1' | 1.1 | 1 |
parseInt() 还有第二个参数
第二个参数用于指定转换时,转换成多少进制(如2进制、8进制、10进制、16进制 等等),默认为10进制。
parseInt('-023x', 8) // -19
parseInt('010', 10) // 10
parseInt('010', 8) // 8
parseInt('0x10',10) // 0
parseInt('0x10',16) // 16
parseInt('0xf', 16) // 15
说到这第二个参数,有一个非常经典的面试题:
['1', '2', '3'].map(parseInt) // 会得到什么结果???
如果你不假思索的写出了 [1, 2, 3]
,那你的面试可能就会Game Over了。
为什么???
正确答案应该是 [1, NaN, NaN]
... 原因就出在parseInt()的第二个参数身上:
然而,map的语法又是这样的:
['1', '2', '3'].map(parseInt)
,其实拆解出来就是: ['1', '2', '3'].map((currentValue, index) => parseInt(currentValue, index))
三个值转换相当于:parseInt('1', 0)
、parseInt('2', 1)
、parseInt('3', 2)
- parseInt('1', 0) 第二个参数为0,相当的没传,即默认值,也就是10进制,正确转换成1;
- parseInt('2', 1) 第二参数不合法,看文档,第二个参数是2-36的值,
如果该参数小于 2 或者大于 36,则 parseInt() 将返回 NaN
;- parseInt('3', 2) 参数合法,但是,2进制里没有3这个数字,所以返回
NaN