讀古今文學網 > 編寫高質量代碼:改善JavaScript程序的188個建議 > 建議50:正確檢測數組類型 >

建議50:正確檢測數組類型

由於數據和對象的數據同源性,導致在JavaScript編程中經常會出現:在必須使用數組時使用了對象,或者在必須使用對像時使用了數組。

選用數組或對象的規則很簡單:當屬性名是小而連續的整數時,應該使用數組,或者當對屬性的位置和排列順序有要求時,應該使用數組。否則,使用對象。

JavaScript語言對數組和對象的區別是混亂的。typeof運算符檢測數組的類型是「object」,這沒有什麼意義,因此在正確檢測數組和對像方面JavaScript沒有提供很多的機制。這時可以通過自定義is_array函數來彌補這個缺陷。


var is_array=function(value){

return value&&typeof value==='object'&&value.constructor===Array;

};


不過,上面函數在識別從不同的窗口(window)或幀(frame)中構造的數組時會失敗,要想準確地檢測外部數組類型,還需要更進一步地完善該函數。


var is_array=function(value){

return value&&

typeof value==='object'&&

value.constructor===Array&&

typeof value.length==='number'&&

typeof value.splice==='function'&&

!(value.propertyIsEnumerable('length'));

};


在完善後的函數中,首先要判斷這個值是否為真,函數不接受null和其他值為假的值。其次,判斷對這個值的typeof運算的結果是否是object。對於對像、數組和null來說,得到的都將是true。接著,判斷這個值是否有一個值為數字的length屬性,對於數組將總是得到true,而對於對像來說並非如此。接下來,判斷這個值是否包含一個splice方法。對於所有數組來說,這又將得到true。最後,判斷length屬性是否是可枚舉的,對於所有數組來說,將得到false,這是對數組最可靠的測試。

不過,使用下面的方法也能夠很好地檢測數組類型,並且這種方法顯得更加簡潔。


var is_array=function(value){

return Object.prototype.toString.apply(value)==='[object Array]';

};