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

if (variable.constructor == Array)

当前回答

在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循环产生?)。这对于所有数组都是错误的。这是我发现的最可靠的阵列测试。不幸的是,它如此复杂。

其他回答

您还可以使用:

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

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

编辑:

截至ES5,现在还有:

Array.isArray(value);

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

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

对于那些编码高尔夫的人来说,这是一个字符最少的不可靠测试:

function isArray(a) {
  return a.map;
}

这通常在遍历/展平层次结构时使用:

function golf(a) {
  return a.map?[].concat.apply([],a.map(golf)):a;
}

input: [1,2,[3,4,[5],6],[7,[8,[9]]]]
output: [1, 2, 3, 4, 5, 6, 7, 8, 9]

如果使用的是Angular,则可以使用Angular.isArray()函数

var myArray = [];
angular.isArray(myArray); // returns true

var myObj = {};
angular.isArray(myObj); //returns false

http://docs.angularjs.org/api/ng/function/angular.isArray

我用的是这行代码:

if (variable.push) {
   // variable is array, since AMAIK only arrays have push() method.
}