javascript怎么判断一个变量是数组

之前strong去见了大神回来问我,怎么判断一个变量是数组,至少要用三种方法。

参见一篇来自前端大全的文章
参考链接在这里

isArray()

照理说这个方法是最简便的方法。

if(Array.isArray(value)){}

但是这个方法在IE9以下的浏览器并不支持

typeof()

数组是特殊的对象,所以数组的typeof结果是object。然而,null的typeof结果也是object。所以要用typeof的话就得写成

var a = [1,2,3];
//是object且要排除null和纯对象
console.log(
(typeof a === 'object' && a !== null &&               Object.prototype.toString.call(a) !== '[object Object]')); //true

instanceof()

对于一个网页或者一个全局作用域而言。这个方法是有效的

if(a instanceof Array){//...}

但是如果这个页面嵌套了frame暂且叫做a.html。
这个frame里定义了window.a= [1,3,5];

那么

window.onload = function(){
    var a = window.frames[0].a;
    console.log(a instanceof Array); //false
    console.log(a.constructor === Array); //false
}

这是因为每个 frame 都有一套自己的执行环境,跨 frame 实例化的对象彼此不共享原型链。如果打印 a instanceof window.frames[0].Array,那么结果就是 true 了。

特性嗅探

var b = [3,4,5];
if(b.sort){//.....}

这样一旦某个对象正好有值为sort的key的话,就会有问题。
比如:

var b = {sort:'aaa'};

这样的话b.sort也是true,所以也不能用。

最靠谱的方法应该是

Object.prototype.toString.call(value)

这个方法的原理是:
每个对象有一个叫做class的内部属性,再配合 call,我们可以取得任何对象的内部属性 [[Class]],然后把类型检测转化为字符串输出。

你可能感兴趣的:(javascript怎么判断一个变量是数组)