方法一:
使用instanceof操作符。instanceof操作符用来判断要检测对象的原型链上是否存在某个构造函数的prototype属性。
var a = {};
var b = [];
console.log(a instanceof Object);//true
console.log(b instanceof Object);//true
使用instanceof操作符有一个问题就是,它假定只有一个全局作用域。如果一个网页中有多个框架(iframe元素),那实际上就存在两个以上不同的全局执行环境,从而存在两个以上不同版本的Array构造函数,如果你从一个框架向另一个框架传入数组,那么传入的数组与第二个框架中原生创建的数组分别具有各自不同的构造函数。传入的数组在该框架中用instanceof操作符判断就会返回false。代码如下:
var a = {};
var b = [];
console.log(a instanceof Object);//true
console.log(b instanceof Object);//true
var frame = document.createElement("iframe"); //创建一个框架
document.body.appendChild(frame);
var c = window.frames[0].Array; //取得框架全局执行环境中的Array构造函数
var d = new c(); //在框架全局执行环境中创建一个数组d
console.log(d instanceof Array);在当前页面的执行环境中用instanceof操作符判断d是否为数组,返回false
console.log(Array.isArray(d)); //true
方法二:
使用ECMAScript 5新增的Array.isArray()方法。这个方法的作用就是确定某个值到底是不是数组,而不管它到底是在哪个全局执行环境中创建的
方法三:
使用Object.prototype上的原生toString()方法判断。
使用方法如下:
Object.prototype.toString.call(value)
该方法返回一个[object NativeConstructorName]格式的字符串。每个类在内部都有一个[[class]]属性,这个属性中就指定了上述字符串中的构造函数名
该方法不能检测非原生构造函数的函数名,因此开发人员定义的任何构造函数都将返回[object Object]
var a = {};
var b = [];
var frame = document.createElement("iframe"); //创建一个框架
document.body.appendChild(frame);
var c = window.frames[0].Array; //取得框架全局执行环境中的Array构造函数
var d = new c(); //在框架全局执行环境中创建一个数组d
console.log(Object.prototype.toString.call(a)); //[object Object]
console.log(Object.prototype.toString.call(b)); //[object Array]
console.log(Object.prototype.toString.call(c)); //[object Array]
function Person(){
this.name = name;
}
var n = new Person();
console.log(Object.prototype.toString.call(n)); //[object Object]