首页 » 编写高质量代码:改善JavaScript程序的188个建议 » 编写高质量代码:改善JavaScript程序的188个建议全文在线阅读

《编写高质量代码:改善JavaScript程序的188个建议》建议6:正确处理JavaScript特殊值

关灯直达底部

1.正确使用NaN和Infinity

NaN是IEEE 754中定义的一个特殊的数量值。它不表示一个数字,尽管下面的表达式返回的是true。


typeof NaN===/'number/'//true


该值可能会在试图将非数字形式的字符串转换为数字时产生,例如:


+/'0/'//0

+/'oops/'//NaN


如果NaN是数学运算中的一个运算数,那么它与其他运算数的运算结果就会是NaN。如果有一个表达式产生出NaN的结果,那么至少其中一个运算数是NaN,或者在某个地方产生了NaN。

可以对NaN进行检测,但是typeof不能辨别数字和NaN的区别,并且NaN不等同于它自己,所以,下面的代码结果令人惊讶。


NaN===NaN//false

NaN!==NaN//true


为了方便检测NaN值,JavaScript提供isNaN静态函数,以辨别数字与NaN区别。


isNaN(NaN)//true

isNaN(0)//false

isNaN(/'oops/')//true

isNaN(/'0/')//false


判断一个值是否可用做数字的最佳方法是使用isFinite函数,因为它会筛除掉NaN和Infinity。Infinity表示无穷大。当数值超过浮点数所能够表示的范围时,就要用Infinity表示。反之,负无穷大为-Infinity。

使用isFinite函数能够检测NaN、正负无穷大。如果是有限数值,或者可以转换为有限数值,那么将返回true。如果只是NaN、正负无穷大的数值,则返回false。

不幸的是,isFinite会试图把它的运算数转换为一个数字。因此,如果值不是一个数字,使用isFinite函数就不是一个有效的检测方法,这时不妨自定义isNumber函数。


var isNumber=function isNumber(value){

return typeof value===/'number/'&&isFinite(value);

}


2.正确使用null和undefined

JavaScript有5种基本类型:String、Number、Boolean、Null和Undefined。前3种都比较好理解,后面两种就稍微复杂一点。Null类型只有一个值,就是null;Undefined类型也只有一个值,即undefined。null和undefined都可以作为字面量在JavaScript代码中直接使用。

null与对象引用有关系,表示为空或不存在的对象引用。当声明一个变量却没有向它赋值的时候,它的值就是undefined。undefined的值会在如下情况中出现:

❑从一个对象中获取某个属性,如果该对象及其prototype链中的对象都没有该属性,该属性的值为undefined。

❑一个函数如果没有显式通过return语句将返回值返回给其调用者,其返回值就是undefined,但在使用new调用函数时例外。

❑JavaScript的函数可以声明任意多个形参,当该函数实际被调用时,传入的参数的个数如果小于声明的形式参数的个数,那么多余的形式参数的值为undefined。

如果对值为null的变量使用typeof检测,得到的结果是“object”,而typeof undefined的值为“undefined”。null==undefined,null!==undefined。

与null不同,undefined不是JavaScript的保留字,在ECMAScript v3标准中才定义undefined为全局变量,初始值为undefined。因此,在使用undefined值时就存在一个兼容问题(早期浏览器可能不支持undefined)。除了直接赋值和使用typeof运算符外,其他任何运算符对undefined的操作都会引发异常。不过,可以声明undefined变量,然后查看它的值,如果它的值为undefined,则说明浏览器支持undefined值。例如:


var undefined;

alert(undefined);


如果浏览器不支持undefined关键字,可以自定义undefined变量,并将其赋值为undefined。例如:


var undefined=void null;


声明变量为undefined,将其初始化为表达式void null的值,由于运算符void在执行其后的表达式时会忽略表达式的结果值,而总是返回值undefined,因此利用这种方法可以定义一个变量为undefined,并将其赋值为undefined。既然是将变量undefined赋值为undefined,还可以使用如下方式:


var undefined=void 1;


或者使用没有返回值的函数:


var undefined=function{};

alert(undefined);///"undefined/"


可以使用typeof运算符来检测某个变量的值是否为undefined:


var a;

if(typeof a==/"undefined/"){

}


3.使用假值

JavaScript的类型系统是非常混乱的,类型特性不明显,而且交叉错乱。JavaScript语法系统拥有一大组假值,如以下代码所示。这些值的布尔值都是false。


0//Number

NaN//Number

/'/'//String

false//Boolean

null//Object

undefined//Undefined


这些值全部都等同于false,但它们是不可互换的。例如,下面用法是错误的。


value=myObject[name];

if(value==null){

}


这是在用一种错误的方式去确定一个对象是否缺少一个成员属性。undefined是缺失的成员属性值,而上面代码片段用null来测试,使用了会强制类型转换的==运算符,而不是更可靠的===运算符。正确的用法如下:


value=myObject[name];

if(!value){

}


undefined和NaN并不是常见,它们是全局变量,还可以改变它们的值,虽然在程序设计中不应该采取这种做法,但可以改变它们的值。