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

if (variable.constructor == Array)

当前回答

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

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)

其他回答

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

例如。,

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

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

_.isArray(object) 

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

我刚想到的:

if(项目长度)//这是一个数组其他的//不是数组

我用的是这行代码:

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

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

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恢复在线时,原始链接保持不变。