JavaScript:判断某个对象是否为数组的四种方法

instanceof 操作符(有限制)

我们可以使用 instanceof 操作符来检测某个对象是否是数组的实例,该检测会返回一个布尔型值(boolean)。如果是数组的话,返回 true,否则的话返回 false

1
2
console.log([] instanceof Array); // true
console.log(/\d+/g instanceof Array); // false

使用 instanceof 操作符有一个问题就是,它假定只有一个全局作用域。如果一个网页中有多个框架(iframe 元素),那实际上就存在两个以上不同的全局执行环境,从而存在两个以上不同版本的 Array 构造函数。如果你从一个框架向另一个框架传入一个数组,那么传入的数组与在第二个框架中原生创建的数组分别具有各自不同的构造函数。传入的数组在该框架中用 instanceof 操作符判断就会返回 false。代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
var a = {};
var b = [];
console.log(a instanceof Object); //true
console.log(b instanceof Array); //true
var frame = document.createElement("iframe"); //创建一个框架
document.body.appendChild(frame);
var c = window.frames[0].Array; //取得框架全局执行环境中的Array构造函数
var d = new c(); //在框架全局执行环境中创建一个数组d
//在当前页面的执行环境中用instanceof 操作符判断 d 是否为数组,返回 false
console.log(d instanceof Array);
console.log(Array.isArray(d)); //true

constructor 属性(有限制)

在javascript中,每个对象都有一个constructor属性,它引用了初始化该对象的构造函数,比如判断未知对象的类型,因此我们可以通过如下方法进行判断:

1
2
3
function myIsArray(obj){
return typeof obj == 'object' && obj.constructor == Array;
}

与使用 instanceof 操作符一样,当存在多个全局作用域时,使用constructor 属性无法进行判断。

Array.isArray()

使用 ES 5 新增的Array.isArray()方法。这个方法的作用就是确定某个值到底是不是数组,而不管它到底是在哪个全局执行环境中创建的。

Object.prototype.toString.call()

该方法返回一个 [object NativeConstructorName] 格式的字符串。每个类在内部都有一个 [[Class]] 属性,这个属性中就指定了上述字符串中的构造函数名。

1
2
3
function myIsArray(obj) {
return Object.prototype.toString.call(obj) == '[object Array]';
}
坚持原创技术分享,您的支持将鼓励我继续创作!

热评文章