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取余操作也可以达到上述效果