用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 这样就没问题了。

 

本文转自:http://www.cnblogs.com/linda586586/p/4227146.html

posted @ 2016-09-18 14:58  沙哥  阅读(203)  评论(0编辑  收藏  举报