在开发中踩了一个坑,在进行两个字符串类型的值比较时,忘记转换成数值类型导致错误。所以借此正好整理下数值类型转换的几种方式的比较与区分。
Number()、parseInt()、parseFloat()的比较区分
- Number()
1. 如果传入的是数值类型,就是简单的传入和返回。
2. 如果传入的是Boolean类型,true和false值将分别被转换为1和0。
3. 如果传入的是null,返回的是0。
4. 如果传入的是undefined,返回的是NaN。
5. 如果传入的是字符串类型:
a. 字符串是整数型数字时,将其转换为十进制数值,忽略前导0。
b. 字符串是有效浮点格式数字时,如"1.1",将其转换为对应的浮点数字,忽略前导0。
c. 字符串是有效的十六进制格式数字时,如"0xf",将其转换为相同大小的十进制数值。
d. 字符串为空,将其转换为0。
e. 字符串中包含除上述格式之外的字符,则将其转换为NaN。
注意a和b情况中,不论是不是以数字开头,如果字符串中除了数字还有别的字符,不会转换为数值,而是转换为NaN。
而在c情况中,只要不是以正确的十六进制数,就转换为NaN。
即都符合第e条。
console.log(Number("012")) //12 (忽略前导0)
console.log(Number("012.3")) //12.3 (忽略前导0)
console.log(Number("1a")) //NaN
console.log(Number("a1")) //NaN
console.log(Number("1.1a")) //NaN
console.log(Number("a1.1")) //NaN
console.log(Number("0xfa")) //250
console.log(Number("0xf~")) //NaN
console.log(Number("a0xf")) //NaN
6. 如果传入的是对象类型,则调用对象的valueOf()方法,然后依照前面的规则转换值。如果转换的结果是NaN,则调用对象的toString()方法,然后再依照前面的规则转换返回的字符串值。
- parseInt()
处理整数时,更常用parseInt()方法。
如果传入的是字符串,parseInt()会忽略字符串前面的空格,直到找到第一个非空格字符;
如果第一个非空字符不是数字或者负号,parseInt()就会返回NaN;所以转换转换空字符串时也是返回NaN;
如果第一个非空字符是数字字符,parseInt()会继续解析第二个字符,直到解析完所有后续字符串或者遇到一个非数字字符。
parseInt()方法还有基模式,可以把二进制、八进制、十六进制或其它任何进制的字符串转换成整数,基是由parseInt()方法的第二个参数指定(默认为十进制)。
所以要解析进制格式的数值时,可以使用parseInt()方法
console.log(parseInt(" 34")) //34 (默认为十进制,忽略字符串前的空格)
console.log(parseInt("ab")) //NaN (第一个非空字符不是数字或负号)
console.log(parseFloat("34ab")) //34 (解析到非数字字符为止)
console.log(parseInt("ab",16)) //171 (按照十六进制解析,“AF”为有效的数值)
console.log(parseInt("10",2)) //2 (按照二进制解析)
- parseFloat()
与parseInt()函数类似,parseFloat()也是会忽略字符串前面的空格,直到找到第一个非空字符,一直解析完所有字符或者遇到一个无效的浮点数字字符为止。
也就是说,字符串中第一个小数点是有效的,而第二个小数点就是无效的,它后面的字符串将被忽略;
parseFloat()只解析十进制,因此没有第二个参数来指定基数;
如果字符串中包含的是一个可解析为正数的数(没有小数点或者小数点后面都是0),parseFloat()会返回整数。
console.log(parseFloat(" 34")) //34 (只解析十进制,忽略字符串前的空格)
console.log(parseFloat("AF")) //NaN (第一个非空字符不是数字或负号)
console.log(parseFloat("34ab")) //34 (解析到无效的浮点数字为止)
console.log(parseFloat("0xf")) //0
console.log(parseFloat("12.5")) //12.5
console.log(parseFloat("022.5")) //22.5
console.log(parseFloat("16.3.35")) //16.3
Number()、parseInt()和parseFloat()的区别:
1. parseFloat()解析的字符串中第一个小数点是有效的,而parseInt()遇到小数点会停止解析。因为小数点并不是有效的数字字符。
2. parseFloat()始终会忽略前导的0,十六进制格式的字符串始终会被转换成0,而parseInt()的第二个参数可以设置基数,按照这个基数的进制来转换。
3. Number()不同于parseInt()和parseFloat()的重要一点是:Number()只要有非数字字符都会返回NaN,不论是否以数字开头;而parseInt()和parseFloat()会取前面的数字。Number()哪怕是以数字开头,只要后面有非数字字符都会转换为NaN。
Number()、parseInt()和parseFloat()的相同点:都会忽略前导0。