讀古今文學網 > 編寫高質量代碼:改善JavaScript程序的188個建議 > 建議6:正確處理JavaScript特殊值 >

建議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並不是常見,它們是全局變量,還可以改變它們的值,雖然在程序設計中不應該採取這種做法,但可以改變它們的值。