如何判断对象是否数组?

来源:互联网 发布:鼠标指针美化软件 编辑:程序博客网 时间:2024/04/30 22:58

在某些情况下,我们可能需要检测一个对象是不是数组,这听起来似乎很简单,实际上并不是这样。

新建一个数组:

var arr=['hello','word']

首先我们会想到typeof操作符进行尝试,typeof的功能为检查某个变量为对象类型还是基本类型,但使用typeof检查arr进行检测时,仅返回object,js中很多数据类型都是object,因此typeof无法判断一个对象是否数组;

其次我们会想到,检测变量类型的方法即为检测该对象是否是另一个对象的实例,instanceof操作符正是用于执行这种检测的,使用instanceof可以检测第一个操作数的对象链是否与第二个操作数的对象链完全相同,简单的说,即为检测X是否为Y的一个实例:

document.write(arr instanceof Array)        //true

类似地,我们还可以检测对象的构造函数是否一样来检测一个对象是否为数组。当创建任何数组时,都会自动地调用Array对象的构造函数,因此,可以使用对象的constructor属性检测其构造函数是否与Array对象的构造函数相同,从而判断对象是否为数组。

document.write( arr.constructor == Array )   //true

instanceof和constructor看似很有希望成功,但是,当检查存在于其他全局作用域中的数组时,这两种方法将失败。

那是不是可以通过数组对象所特有的一个方法join()方法来判定对象是否是数组呢?我们知道,方法是可以自定义的,当某个对象自定义方法也叫join()时,这种想法被否决了。

那么,是否存在一种能够可靠地检测出对象是否数组的方法?答案当然是YES!那就是在被检测对象的上下文中调用toString()方法,然后检测toString()返回的结果字符串:

function isArray( obj ){    return Object.prototype.toString.apply(obj)==='[object Array]'}

但是,不能将该方法放在任何对象的prototype属性中,否则在进行跨框架页的检测时该方法将失败。

原创粉丝点击