总结《JavaScriptt高级程序设计》中介绍判断某个对象是否是数组的方法。
第一种方法:
使用instanceof操作符。instanceof操作符用来判断要检测对象的原型链上是否存在某个构造函数的prototype属性。
语法: A instanceof B,意思是对象A的原型是否是B.prototype。如果是,返回true,如果不是,返回false。
1 var a={}; 2 var b=[]; 3 console.log(a instanceof Object);//true 4 console.log(b instanceof Array);//true
使用instanceof操作符有一个问题就是,它假定只有一个全局作用域。如果一个网页中有多个框架(iframe元素),那实际上就存在两个以上不同的全局执行环境,从而存在两个以上不同版本的Array构造函数。如果你从一个框架向另一个框架传入一个数组,那么传入的数组与在第二个框架中原生创建的数组分别具有各自不同的构造函数。传入的数组在该框架中用instanceof操作符判断就会返回false。代码如下:
1 var a={}; 2 var b=[]; 3 console.log(a instanceof Object);//true 4 console.log(b instanceof Array);//true 5 6 var frame=document.createElement("iframe");//创建一个框架 7 document.body.appendChild(frame); 8 var c=window.frames[0].Array;//取得框架全局执行环境中的Array构造函数 9 var d=new c();//在框架全局执行环境中创建一个数组d 10 console.log(d instanceof Array);//在当前页面的执行环境中用instanceof操作符判断d是否为数组,返回false 11 console.log(Array.isArray(d));//true
第二种方法:
使用ECMAScript 5新增的Array.isArray()方法。这个方法的作用就是确定某个值到底是不是数组,而不管它到底是在哪个全局执行环境中创建的。
第三种方法:
使用使用Object.prototype上的原生toString()方法判断。
使用方法如下:
Object.prototype.toString.call(value)
该方法返回一个[object NativeConstructorName]格式的字符串。每个类在内部都有一个[[Class]]属性,这个属性中就指定了上述字符串中的构造函数名。
该方法不能检测非原生构造函数的函数名,因此开发人员定义的任何构造函数都将返回[object Object]。
1 var a={}; 2 var b=[]; 3 var frame=document.createElement("iframe");//创建一个框架 4 document.body.appendChild(frame); 5 var c=window.frames[0].Array;//取得框架全局执行环境中的Array构造函数 6 var d=new c();//在框架全局执行环境中创建一个数组d 7 console.log(Object.prototype.toString.call(a));//[object Object] 8 console.log(Object.prototype.toString.call(b));//[object Array] 9 console.log(Object.prototype.toString.call(d));//[object Array] 10 11 function Person() { 12 this.name=name; 13 } 14 var n=new Person(); 15 console.log(Object.prototype.toString.call(n));//[object Object]
参考:
1、js如何判断一个对象是不是Array? http://www.nowamagic.net/librarys/veda/detail/1250
2、JavaScript中toStirng()与Object.prototype.toString.call()方法浅谈 http://www.zhufengpeixun.cn/JavaScriptmianshiti/2014-02-28/271.html
3、JavaScript:Object.prototype.toString方法的原理 http://www.cnblogs.com/ziyunfei/archive/2012/11/05/2754156.html