1、防止浮点数溢出
二进制的浮点数不能正确的处理十进制小数,因此0.1+0.2不等于0.3
num=0.1+0.2; //0.3000 0000 0000 0000 4
幸运的是,浮点数中的整数运算是精确的,所以小数表现出来的问题可以通过指定精度来避免,如将上面的改为:
num=(1+2)/10; //0.3
2、慎用JavaScript类型自动转换
在JavaScript中能够自动转换变量的数据类型,这种转换是一种隐性行为。在自动转换数据类型时,JavaScript一般遵循:如果某个类型的值被用于需要其他类型的值的环境中,JavaScript就自动将这个值转换成所需要的类型。
数据类型自动转换
值(value) | 字符串操作环境 | 数字运算环境 | 逻辑运算环境 | 对象操作环境 |
undefined | "undefined" | NaN | false | Error |
null | "null" | 0 | false | Error |
非空字符串 | 不转换 | 字符串对应的数字值 | ||
NaN | true | String | ||
空字符串 | 不转换 | 0 | false | String |
0 | "0" | 不转换 | false | Number |
Infinity | "Infinity" | 不转换 | false | Number |
Number:POSITIVE_INFINITY | "Infinity" | 不转换 | true | Number |
Number:NEGATIVE_INFINITY | "-Infinity" | 不转换 | true | Number |
Number:MAX_VALUE | “1.7976931348623157e+308” | 不转换 | true | Number |
Number:MIN_VALUE | "5e-324" | 不转换 | true | Number |
其他所有数字 | "数字的字符串值" | 不转换 | true | Number |
NaN | "NaN" | 不转换 | false | Number |
true | "true" | 1 | 不转换 | Boolean |
false | "false" | 0 | 不转换 | Boolean |
对象 | toString() | valueOf()或toString()或NaN | true | 不转换 |
3、正确检测数据类型
使用typeof运算符返回一个用于识别其运算数类型的字符串。对于任何变量来说,使用typeof运算符总是以字符串的形式返回以下6种类型之一:
number
string
boolean
object
function
undefined
不幸的是,在使用typeof检测null时,返回的是“object”。
对于对象或数组,可以使用constructor属性,该属性值引用的是原来构造该对象的函数。如果结合typeof和constructor,基本能够完成数据类型的检测。
4、避免使用parseInt
parseInt是一个将字符串转换为整数的函数,与parseFloat(将字符串转换为浮点数)对应,用于将非数字的原始值转换为数字。
如:
parseInt("123abc") //123
parseInt("1.73") //1
parseInt(".44") //NaN
浮点数中的点号对于parseInt来说属于非法字符,因此它不会被转换并返回,这样,在使用parseInt时,就存在潜在的误用风险。对于以0开头的数字字符串,parseInt()函数会把它作为八进制数字处理,先把它转换为数值,然后再转换为十进制的数字返回。对于以0x开头的数字字符串,parseInt()函数会把它作为十六进制数字处理,先把它转换为数值,然后再转换为十进制的数字返回。
如:
var d="010"; //八进制
parseInt(d); //8
幸运的是,parseInt可以接受一个基数作为参数,这样parseInt("08",10)(十进制)结果为8。建议读者在使用parseInt时,一定要提供这个基数参数。