JavaScript中的数值转换方法

199 阅读3分钟

JavaScript共提供了三种函数用于将非数值类型转换为数值,Number(),parseInt(),parseFloat(),其他的数值转化方法还有运算符的使用等,简单梳理一下

1.Number()函数

Number()是转型函数,可以用于任何数据类型。

Number()函数的转换规则如下:

  • 若参数为布尔值,true转换为1,false转换为0

  • 若参数为null,返回0

  • 若参数为undefind,返回NaN

  • 若参数为数值,直接返回

  • 若参数为对象,则调用valueOf()方法,然后依照前面的规则转换返回的值。如果转换的结果是NaN,则调用的对象的toString()方法,然后再次依照前面的规则转换返回的字符串值

  • 若参数为字符串:

    • 如果字符串只包含数值字符(数字,加减号,小数点),转换为一个十进制数值返回
    • 如果是空字符串,返回0
    • 如果是有效的十六进制格式如“0xf”,则返回它对应的十进制整数
    • 如果字符串包含数值字符外的其他字符返回NaN
Number(true) //1
Number(false) //0
Number(null) //0
Number(undefined) //NaN
Number(123) //123
Number(0xa) //10
Number(06) //6  
Number(2e5) //200000
Number('2e5') //200000
Number('true') //NaN
Number('123adc') //NaN  
Number('123') //123
Number('0xa') //10
Number('06') //6

2.parseInt()函数

parseInt()更专注于字符串是否包含数值模式。

parseInt()函数的转换规则如下:

  • 从第一个非空格字符开始转换,如果第一个字符不是整型数值字符(数字,加减号)返回NaN,否则依次检测字符知道字符串末尾或者遇见非数值字符

  • paseInt()函数可以接收第二个参数,用于指定进制:

    • 第二个参数可选范围2-36,超出范围后,无论第一个参数为何值,都返回NaN
    • 第二个参数不填或者为null,undefined,0,' ',NaN等假值时默认为10
    • 如果提供了第二个参数,字符串前面对应进制的格式可以省掉

值得一提的是paseInt()不能正确转换科学计数法格式的字符串,会按照转换规则对字符e前的部分处理

parseInt(true) //NaN
parseInt(false) //NaN
paeseInt(null) //NaN
paeseInt(undefined) //NaN
parseInt(' ') //NaN
parseInt(0xa) //10
parseInt(06.3) //6
parseInt(2e5) //200000
parseInt('2e5') //2
parseInt('123adc') //123
parseInt('0xa') //10
parseInt('f') //NaN
parseInt('f',16) //15

3.parseFloat()函数

parseFloat()函数的工作方式和parseInt()函数类似,他的转换规则如下:

  • 从0位置检测每一个字符,解析到字符串末尾或者第一个无效的浮点数值字符为止,第一个小数点有效,第二个小数点开始就是无效字符了

  • parseFloat()函数只能解析十进制格式字符串,不能指定进制数,不能正确解析十六进制数值

  • parseFloat()函数能正确表示浮点数以及科学计数法

parseFloat('22.2.3') //22.2
parseFloat(0xf) //15
parseFloat('0xf') //0
parseFloat(1e3) //1000
parseFloat('1e3') //1000

4.运算操作符

一元加运算符(+)应用到非数值时也会执行类型转换,遵循和Number()函数一样的转换规则

同理后缀自增/自减运算符也可以用来进行数值转换,他们同样是遵循和Number()函数一样的转换规则

对非数值类型进行乘除1或者对Infinity取余操作也可以达到上述效果