Number()和parseInt()、parseFloat()的区别

1,701 阅读3分钟

三者的作用:把其他数据类型转换成数字

区别:Number() 可以用于任何数据类型转换成数值;parseInt() 用于将字符串转换成数值

parseInt()parseFloat() 这两者的区别就是整数浮点数的区别,所以本文将只比较Number()parseInt()

一、Number()

  1. Boolean值,true 转换成 1, false 转换成 0;

  2. null,返回0;

  3. undefined, 返回NaN;

  4. 如果是字符串:

    • 字符串只包含数据时,将转换成十进制的数值,第一个数字是0的话,将会忽略,如:Number('0123') -> 123

    • 字符串包含有效的浮点数,如“1.1”,将转换成对应的浮点数,如:Number('01.1') -> 1.1

    • 字符串包含有效的十六进制格式,如“0xf”,将转换成相同大小的十进制数值,如:Number('0xf') -> 15

    • 字符串为空,转换成0,如:Number('') -> 0

    • 字符串包含了除上面这几种格式外的字符,将转换成NaN,如:Number('123x') -> NaN

  5. 如果是对象,则调用对象的ValueOf()方法,然后依照前面的规则转换返回的值;如果转换的结果是NaN,则调用的对象的toString()方法,然后再次依照前面的规则转换返回的字符串值。

二、parseInt()

只能将字符串转换成数值;与 Number()转字符串的区别是:

  1. 字符串数字开头或者负号开头,往后取值,直到非数字停止,如:parseInt('123x') -> 123parseInt('-023x') -> -23,注意:parseInt('-0a') -> -0parseInt('-0x') -> NaN(0x为十六进制数的开头)、parseInt('-abc') -> NaN

  2. 字符串非数字或者负号开头,则为NaN,如:parseInt('x123') -> NaN

  3. 空字符串,返回NaN, 如:parseInt('') -> NaN

  4. parseInt('1.1') -> 1 这也是它和 parseFloat() 的差别。

Number() 和 parseInt() 对比的一张表

Number()parseInt()
''0NaN
true/false1/0NaN
'0123'123123
'123x'NaN123
'x123'NaNNaN
'01.1'1.11

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)

  1. parseInt('1', 0) 第二个参数为0,相当的没传,即默认值,也就是10进制,正确转换成1;
  2. parseInt('2', 1) 第二参数不合法,看文档,第二个参数是2-36的值,如果该参数小于 2 或者大于 36,则 parseInt() 将返回 NaN
  3. parseInt('3', 2) 参数合法,但是,2进制里没有3这个数字,所以返回NaN