欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2024-02-26 15:35:40
...

之前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]],然后把类型检测转化为字符串输出。