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

if (variable.constructor == Array)

当前回答

代码引用自https://github.com/miksago/Evan.js/blob/master/src/evan.js

  var isArray = Array.isArray || function(obj) {
    return !!(obj && obj.concat && obj.unshift && !obj.callee);};

其他回答

我用的是这行代码:

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

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

如果使用的是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

当我发布这个问题时,我使用的JQuery版本没有包含isArray函数。如果是这样的话,我可能会使用它,相信该实现是执行这种特定类型检查的最佳浏览器独立方式。

因为JQuery现在确实提供了这个功能,所以我会一直使用它。。。

$.isArray(obj);

(自1.6.2版起)它仍然使用以下形式的字符串比较来实现

toString.call(obj) === "[object Array]"

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

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]