数值转换
Javascript中有3个函数可以把非数值转换为数值:Number() 、parseInt() 、ParseFloat()。
其中,Number() 可以用于任何数据类型,parseInt() 、ParseFloat()则专门用于把字符串转换为数值。这三个函数对于同样的输入会有返回不同的结果。
Number() 函数转换规则
1、如果是数字值,只是简单的传入和返回,即返回数字本身;
2、如果是Boolean值,true和false将分别被转换为1和0;
3、如果是null值,返回0;
4、如果是undefined,返回NaN;
5、如果是字符串,则
(1)如果字符串中只包含数字(包括前面带正负号的情况),则将其转换为十进制数值;(前导的零会被忽略)
(2)如果字符串中包含有效的浮点格式,则将其转换为对应的浮点数值;(前导的零会被忽略)
(3)如果字符串中包含有效的十六进制格式,则将其转换为相同大小的十进制整数值;
(4)如果字符串是空的,则将其转换为0;
(5)如果字符串中包含除上述格式以外的字符,则将其转换为NaN.
6、如果是对象,则调用对象的valueOf()方法,然后依照前面的规则转换为返回的值。如果转换的结果是NaN,则调用对象的toString()方法,然后再按照前面的规则转换返回的字符串值。
ps:一元加操作符的操作与Number()函数相同。
parseInt() 函数转换规则
1、如果是整数值,只是简单的传入和返回,即返回数字本身;
2、如果是浮点数,只保留整数部分(向下取整);
3、如果是Boolean值,true和false将被转换为NaN;
4、如果是null值,返回NaN;(不同于Number()方法)
5、如果是undefined,返回NaN;
6、如果是字符串,若字符串第一个非空字符前面含有空格,则忽略空格,直接从第一个非空字符开始解析。如果第一个非空字符不是数字或者负号,则返回NaN;如果第一个非空字符是数字,则继续解析直至解析完毕或者遇到一个非数字符号为止。 例如 “ 1234blue”会被转换为1234
parseFloat() 函数转换规则
ParseFloat()的转换规格和parseInt() 基本类似,也是从第一个非空字符开始解析每个字符。而且也是一直解析到字符串末尾,或者解析到遇到一个无效的浮点数字字符为止。也就是说,字符串中的第一个小数点是有效的,而第二个小数点就是无效的了,因此它后面的字符串将被忽略。 例如 “ 22.34.5”会被转换为22.34
ParseFloat()和parseInt() 还有一个重要的区别在于ParseFloat()始终都会忽略前导的零,意思就是ParseFloat()可以识别几乎所有的浮点数值格式,也包括十进制整数格式,但十六进制格式的字符串则始终会被转换为0. 例如 “0xA” 会被转换为0
最后还应注意的是:如果字符串包含的是一个可解析为整数的书(没有小数点,或者小数点后都是零),ParseFloat()会返回整数。
parseInt()传入参数
可以为parseInt()函数传入第二个参数:转换时使用的基数(即多少进制)。
var num = parseInt("0xAF", 16); //175 var num1 = parseInt("AF", 16); //175 var num2 = parseInt("AF"); //NaN
指定基数会影响到转换的输出结果。
var num1 = parseInt("10", 2); //2 – parsed as binary var num2 = parseInt("10", 8); //8 – parsed as octal var num3 = parseInt("10", 10); //10 – parsed as decimal var num4 = parseInt("10", 16); //16 – parsed as hexadecimal
不指定基数意味着让parseInt()决定如何解析输入的字符串,因此为了避免错误的解析,建议无论在上面情况下都明确指定基数。
参考:《Js高级程序设计》第三版P30-32