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

if (variable.constructor == Array)

当前回答

我在这里尝试了大多数解决方案。但没有一个有效。然后我提出了一个简单的解决方案。希望它能帮助某人并节省他们的时间。

if(variable.constructor != undefined && variable.constructor.length > 0) {
        /// IT IS AN ARRAY
} else {
       /// IT IS NOT AN ARRAY
}

其他回答

您还可以使用:

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

如果您只处理EcmaScript 5及以上版本,那么可以使用内置的Array.isArray函数

例如。,

Array.isArray([])    // true
Array.isArray("foo") // false
Array.isArray({})    // false

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

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

由于.length属性对于javascript中的数组是特殊的,因此可以简单地说

obj.length === +obj.length // true if obj is an array

Undercorejs和其他几个库使用这个简单的技巧。