Q:如何判斷一個對象是否為數組?
A1:判斷對象的constructor是否指向Array, 接着判斷對應的特殊屬性,如length,splice之類.這個很容易冒充。
A2:使用instanceof判斷對象是否為數組的實例。一般情況下可行,在某些極端情況下,會出錯。例如,有個A頁面定義了一個數組a,頁面又嵌套了一個iframe,在Iframe里面通過 top.a instanceof Array, 是返回false的.其他情況,見下面詳解。
A3:通過Object.prototype.toString.call(obj)這樣就可以了,JQ源碼也是這樣寫的。Extjs也是這樣寫的。這樣會返回[Object Array]。如果obj是一個對象,並且擁有一些數組的屬性和方法,會返回[object Object],如下:
var obj = { length:3, slice:function(){} }; Object.prorotype.toString.call(obj);//[object Object]
A4:ES5定義了Array.isArray:
Array.isArray([]);//true
對於不支持這個方法的瀏覽器,可以添加這個方法:
if(typeof Array.isArray === "undefined"){ Array.isArray = function(arg){ return Object.prototype.toString.call(arg) === "[object Array]"; }; }
instanceof相關:
1.構造函數的prototype指向Array的prototype:
function Test(){} Test.prototype = Array.prototype; var t = new Test(); alert(t instanceof Array);//true
2.構造函數的prototype指向一個數組:
function Test(){} Test.prototype = []; var t = new Test(); alert(t instanceof Array);//true
知道了instanceof的原理,那么前面所說的 top.arr instanceof Array這個問題也自然知道什么原因了,Array實質是window.Array(可以試着判斷下), 自然top.Array和iframe內的window.Array是不同的,所以會導致instanceof失效。如果top.arr instanceof top.Array 這樣就沒問題了。