建议4:注意JavaScript数据类型的特殊性(4)
4.避免误用parseInt
parseInt是一个将字符串转换为整数的函数,与parseFloat(将字符串转换为浮点数)对应,这两种函数是JavaScript提供的两种静态函数,用于把非数字的原始值转换为数字。
在开始转换时,parseInt会先查看位置0处的字符,如果该位置不是有效数字,则将返回NaN,不再深入分析。如果位置0处的字符是数字,则将查看位置1处的字符,并重复前面的测试,依此类推,直到发现非数字字符为止,此时parseInt()函数将把前面分析合法的数字字符转换为数值并返回。
- parseInt("123abc"); // 123
- parseInt("1.73"); // 1
- parseInt(".123"); // NaN
浮点数中的点号对于parseInt来说属于非法字符,因此它不会被转换并返回,这样,在使用parseInt时,就存在潜在的误用风险。例如,我们并不希望parseInt("16")与parseInt("16 tons")产生相同的结果。如果该函数能够提醒我们出现额外文本就好了,但它不会那么做。
对于以0为开头的数字字符串,parseInt()函数会把它作为八进制数字处理,先把它转换为数值,然后再转换为十进制的数字返回。对于以0x开头的数字字符串, parseInt()函数则会把它作为十六进制数字处理,先把它转换为数值,然后再转换为十进制的数字返回。例如:
- var d = "010"; //八进制
- var e = "0x10"; //十六进制
- parseInt(d); //8
- parseInt(e); //16
如果字符串的第一个字符是0,那么该字符串将基于八进制而不是十进制来求值。在八进制中,8和9不是数字,所以parseInt("08")和parseInt("09")的结果为0,这个错误导致了在程序解析日期和时间时经常会出现问题。幸运的是,parseInt可以接受一个基数作为参数,这样parseInt("08",10)结果为8,parseInt("09",10)结果为9。因此,建议读者在使用parseInt时,一定要提供这个基数参数。
通过在parseInt中提供基数参数,可以把二进制、八进制、十六进制等不同进制的数字字符串转换为整数。例如,下面把十六进制数字字符串"123abc"转换为十进制整数。
- parseInt("123abc",16); // 1194684
再如,把二进制、八进制和十进制数字字符串转换为整数: - parseInt("10",2); //把二进制数字10转换为十进制整数为2
- parseInt("10",8); //把八进制数字10转换为十进制整数为8
- parseInt("10" ,10); //把十进制数字10转换为十进制整数为10