如何在JavaScript中检查变量是否为数组?

if (variable.constructor == Array)

当前回答

我认为使用myObj.constructor==Object和myArray.constructor==Array是最好的方法。它几乎比使用toString()快20倍。如果您使用自己的构造函数扩展对象,并希望这些创建也被视为“对象”,那么这是行不通的,但否则它会更快。typeof与构造函数方法一样快,但typeof[]=='object'返回true,这通常是不可取的。http://jsperf.com/constructor-vs-tostring

需要注意的一点是null.constructor将抛出一个错误,因此如果您可能要检查null值,则必须首先执行以下操作:(testThing!==null){}

其他回答

我想我会为那些可能已经在脚本中使用Undercore.js库的人添加另一个选项。Undercore.js有一个isArray()函数(请参见http://underscorejs.org/#isArray).

_.isArray(object) 

如果对象是数组,则返回true。

您还可以使用:

if (value instanceof Array) {
  alert('value is Array!');
} else {
  alert('Not an array');
}

在我看来,这是一个非常优雅的解决方案,但对每个人来说都是自己的。

编辑:

截至ES5,现在还有:

Array.isArray(value);

但这将在旧浏览器上打破,除非您使用的是polyfills(基本上…IE8或类似)。

在Crockford的JavaScript The Good Parts中,有一个函数可以检查给定的参数是否为数组:

var is_array = function (value) {
    return value &&
        typeof value === 'object' &&
        typeof value.length === 'number' &&
        typeof value.splice === 'function' &&
        !(value.propertyIsEnumerable('length'));
};

他解释道:

首先,我们问这个价值是否真实。我们这样做是为了拒绝空值和其他错误值。第二,我们询问值的类型是否为“object”。这对于对象、数组和(奇怪的)null都是正确的。第三,我们询问该值是否具有数字的长度属性。对于数组总是如此,但对于对象通常不是如此。第四,我们询问该值是否包含拼接方法。这同样适用于所有阵列。最后,我们问长度属性是否可枚举(长度是否由for in循环产生?)。这对于所有数组都是错误的。这是我发现的最可靠的阵列测试。不幸的是,它如此复杂。

在现代浏览器(以及一些传统浏览器)中,您可以

Array.isArray(obj)

(支持Chrome 5、Firefox 4.0、IE 9、Opera 10.5和Safari 5)

如果需要支持旧版本的IE,可以使用es5垫片来polyfill Array.isArray;或添加以下内容

# only implement if no native implementation is available
if (typeof Array.isArray === 'undefined') {
  Array.isArray = function(obj) {
    return Object.prototype.toString.call(obj) === '[object Array]';
  }
};

如果使用jQuery,可以使用jQuery.isArray(obj)或$.isArra(obj

如果不需要检测在不同帧中创建的数组,也可以只使用instanceof

obj instanceof Array

注意:可以用于访问函数参数的arguments关键字不是Array,尽管它(通常)的行为类似于:

var func=函数(){console.log(参数)//[1,2,3]console.log(arguments.length)//3console.log(Array.isArray(参数))//false!!!console.log(argument.slice)//未定义(Array.prototype方法不可用)console.log([3,4,5].slice)//函数slice(){[本机代码]}}函数(1,2,3)

通过Crockford:

function typeOf(value) {
    var s = typeof value;
    if (s === 'object') {
        if (value) {
            if (value instanceof Array) {
                s = 'array';
            }
        } else {
            s = 'null';
        }
    }
    return s;
}

Crockford提到的主要失败是无法正确确定在不同上下文(例如窗口)中创建的数组。如果这还不够的话,该页面有一个更复杂的版本。