【Javascript】Javascript中如何判断变量是数组类型
在Javascript中,数组与传统的数组类型不同,它是一个特殊的对象,并具有可以通过数字作为下标的访问数据方式,特殊的length,数组相关的方法等特点。这个特性使得JS中的数组使用起来更加灵活,但与此,也带来一些小麻烦,有时我们会把数组当成对象,有时又会将对象当成数组。因此,判断该变量是否是数组变得十分必要。那么如何判断一个变量是数组呢?
我们首先想到的就是typeof方法,最简单的例子:
var a=[]; alert(typeof a);
上述代码弹出的不是array,而是object!个人感觉这是设计的失败,因为typeof得出的结果没有意义(并不代表它错了,因为数组确实是对象,只是这里我们想知道它是不是数组)。
既然typeof方法不行,那就换一个方法。我们知道,数组也是对象,在我们创建数组时,它也有一个原型prototype,我们就用这个prototype中最原始的方法来做吧。见如下代码:
var t=[]; alert(t.constructor===Array);
非常好!它如愿以偿返回了true,这个方法在大多数情况屡试不爽,并且可以将数组和对象分辨出来。因此,在大部分的情况下,这个方法是非常可行的办法。
但是需要说明的是,仅仅是大部分情况下。如果我们的脚本跨域执行,或访问iframe、frame、不同window的变量时,它就会出问题。例如,我们创建一个页面main.html,在body中插入iframe(id为aa),它的src是另外一个页面:inner.html。inner.html的代码如下:
var ia=[];
main.html页面的js代码如下:
window.onload=function(){ alert(document.getElementById('aa').contentWindow.ia.constructor===Array); }
当main.html页面打开时,会弹出false。原因是因为===运算符造成的,因为inner.html中的ia变量是通过inner页面的window下的Array构造的,而这段代码的Array是main页面中的Array,因此返回了false。针对这种方法我们需要一个适应性更强的方法。下面代码为最终解:
alert(Object.prototype.toString.apply(document.getElementById('aa').contentWindow.ia)==='[object Array]');
通过这样的方法,我们就可以得到准确的Array类型了。在多次使用时,我们不妨封装成一个函数:
function is_array(val){ return Object.prototype.toString.apply(val)==='[object Array]'; }