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

if (variable.constructor == Array)

当前回答

有几种方法可以检查变量是否为数组。最好的解决方案是您选择的解决方案。

variable.constructor === Array

这是Chrome上最快的方法,很可能是所有其他浏览器。所有数组都是对象,因此检查构造函数属性是JavaScript引擎的快速过程。

如果在查找对象属性是否为数组时遇到问题,则必须首先检查该属性是否存在。

variable.prop && variable.prop.constructor === Array

其他一些方式包括:

Array.isArray(variable)

使用Chrome 75更新2019年5月23日,向@AnduAndrici喊话,感谢他让我再次提出他的问题在我看来,这最后一个是最丑的,也是速度最慢的。第一个例子是大约1/5的速度。这家伙速度慢了2-5%,但很难说。坚固耐用!结果给我留下了深刻印象。Array.prototype实际上是一个数组。你可以在这里了解更多https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/isArray

variable instanceof Array

该方法的运行速度约为第一个示例的1/3。如果你只关注漂亮的代码而不太关注性能,那么它仍然很坚固,看起来更干净。注意,检查数字不起作用,因为变量instanceof Number总是返回false。更新:instanceof现在的速度是2/3!

所以还有一个更新

Object.prototype.toString.call(variable) === '[object Array]';

这家伙是检查阵列最慢的。然而,这是一个一站式商店为任何类型的你正在寻找。然而,由于您要查找数组,所以只需使用上面最快的方法。

此外,我进行了一些测试:http://jsperf.com/instanceof-array-vs-array-isarray/35所以玩得开心一点,看看吧。

注意:@EscapeNetscape在jsperf.com关闭时创建了另一个测试。http://jsben.ch/#/QgYAV我想确保jsperf恢复在线时,原始链接保持不变。

其他回答

有多种解决方案都有其独特之处。本页提供了一个很好的概述。一种可能的解决方案是:

function isArray(o) {
  return Object.prototype.toString.call(o) === '[object Array]'; 
}

通用解决方案如下:

Object.prototype.toString.call(obj)=='[object Array]'

从ECMAScript 5开始,正式的解决方案是:

Array.isArray(arr)

此外,对于旧的JavaScript库,您可以找到以下解决方案,尽管它不够准确:

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

解决方案来自http://www.pixelstech.net/topic/85-How-to-check-whether-an-object-is-an-array-or-not-in-JavaScript

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

_.isArray(object) 

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

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

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

这是一个老问题,但有同样的问题,我找到了一个非常优雅的解决方案,我想分享。

将原型添加到Array使其非常简单

Array.prototype.isArray = true;

现在,如果您有一个要测试的对象,看看它是否是一个数组,您只需要检查新属性

var box = doSomething();

if (box.isArray) {
    // do something
}

isArray仅在其为数组时可用