由於數據和對象的數據同源性,導致在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]';
};