js非数值转换为数值的三种写法分别为Number()、parseInt()、parseFloat()。
Number()是最复杂的。规则如下:
1.数值直接输出;
console.log(Number(‘11‘));//输出11;
2.Boolean值,true转换成1,false转换成0;
console.log(Number(true));//输出1;
console.log(Number(false));//输出0;
3.null转换成0,undefined转换成NaN
console.log(Number(null));//输出0;
console.log(Number(undefined));//输出NaN;
4.字符串转换又有很多规则:
(1)字符串只包含数字,会转换成十进制,忽略前面的0,例如
console.log(Number(‘011‘));//输出11;
(2)字符串包含有效的浮点格式,会转换成小数,同样忽略前面的0,例如
console.log(Number(‘000.11‘));//输出0.11;
(3)字符串包含有效的十六进制格式,会转换成大小相等的十进制格式数值输出
console.log(Number(‘0xa‘));//输出10;
(4)字符串为空,不包含任何字符,转换为0
console.log(Number(‘‘));//输出0;
(5)除以上字符串外的字符串,转换为NaN
console.log(Number(‘Hello!‘));//输出NaN;
Number()的转换规则确实有些复杂了。并且在某些情况下可能并不是我们想要的结果。通常我们用parseInt()来进行数值的转换。
parseInt()不会转换非数值模式的格式。它会忽略字符串前面的空格,直到找到一个非空格字符:
1.如果这个字符不是数字符号或者负号,则返回NaN
console.log(parseInt(‘ Hello!‘));//输出NaN;
空字符串返回NaN,这一点跟Number()不同。
console.log(parseInt(‘ ‘));//输出NaN;
如果是数字符号或者负号,会继续解析第二个,直到解析完所有或者遇到非数字符号字符
console.log(parseInt(‘123hehe‘));//输出123;
非字符后面的数字也会被忽略
console.log(parseInt(‘123hehe123‘));//输出123;
小数点是非数字符号字符,会导致解析中止。
console.log(parseInt(‘12.3‘));//输出12
如果第一个非空格字符是数字,parseInt()可以解析各种整数格式,包括八进制,十进制,十六进制
console.log(parseInt(‘070‘));//es3输出56(八进制),es5输出70(十进制); console.log(parseInt(‘70‘));//70(十进制); console.log(parseInt(‘0xa‘));//10(十六进制);
可见es3和es5在解析八进制存在差异,es5已经不具备解析八进制的能力。因此我们有必要使用parseInt()的第二个参数
console.log(parseInt(‘070‘,8));//输出56; console.log(parseInt(‘070‘,10));//输出70; console.log(parseInt(‘70‘,8));//输出56; console.log(parseInt(‘70‘,10));//输出70; console.log(parseInt(‘0xa‘,16));//输出10;
如果指定16作为第二个参数,前面的0x就可以省略了,如果没指定则不能省略,否则返回NaN
console.log(parseInt(‘a‘,16));//输出10; console.log(parseInt(‘a‘));//输出NaN;
建议使用parseInt()任何时候都加上转换基数。
parseInt()不能转换浮点型数值,我们用parseFloat()来解决。
parseFloat()跟parseInt()差不多,同样会从第一个非空字符串开始解析,直到解析完毕,或者遇到非浮点型数值格式(区别一),但是它会忽略前面所有的0,他没有转换基数,只解析十进制的值(区别二)
console.log(parseFloat(‘ 123hehe‘));//输出123; console.log(parseFloat(‘123hehe‘));//输出123; console.log(parseFloat(‘01.2.3‘));//输出1.2; console.log(parseFloat(‘0xa‘));//输出0
注意,如果字符串可以解析为整数,则小数点后面的0不会输出
console.log(parseFloat(‘1.000‘));//输出1;