javascript-如何判斷一個對象為數組


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 這樣就沒問題了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM