建议4:注意JavaScript数据类型的特殊性

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时,一定要提供这个基数参数

猜你喜欢

转载自blog.csdn.net/zmeilin/article/details/81211745