协慌网

登录 贡献 社区

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

我想检查变量是 JavaScript 中的数组还是单个值。

我找到了一个可能的解决方案......

if (variable.constructor == Array)...

这是最好的方法吗?

答案

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

variable.constructor === Array

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

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

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

其他一些方法是:

variable instanceof Array

该方法的速度约为第一个例子的1/3 。仍然相当稳固,看起来更干净,如果你只是漂亮的代码,而不是性能。请注意,检查数字不起作用variable instanceof Number始终返回false更新: instanceof现在速度提高了 2/3!

Array.isArray(variable)

在我看来,最后一个是最丑的,它是最慢的之一。运行速度约为第一个例子的 1/5。 Array.prototype,实际上是一个数组。你可以在这里阅读更多相关信息https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/isArray

还有另一个更新

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

这个人是尝试检查数组最慢的人。但是,对于您正在寻找的任何类型,这是一站式商店。但是,由于您正在寻找一个数组,只需使用上面最快的方法。

另外,我进行了一些测试: http//jsperf.com/instanceof-array-vs-array-isarray/33所以有一些乐趣并检查出来。

注意:@EscapeNetscape 在 jsperf.com 关闭时创建了另一个测试。 http://jsben.ch/#/QgYAV我想确保只要 jsperf 重新上线,原始链接就会保留。

你也可以使用:

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

这对我来说似乎是一个非常优雅的解决方案,但对于他自己而言。

编辑:

从 ES5 开始,现在还有:

Array.isArray(value);

但是这会在旧版浏览器上中断,除非你使用的是 polyfill(基本上...... IE8 或类似的)。

我注意到有人提到了 jQuery,但我不知道有一个isArray()函数。事实证明它是在 1.3 版本中添加的。

彼得建议 jQuery 实现它:

isArray: function( obj ) {
    return toString.call(obj) === "[object Array]";
},

我已经非常相信 jQuery(特别是他们的跨浏览器兼容技术)我将升级到 1.3 版并使用他们的功能(提供升级不会导致太多问题)或直接在我的使用这个建议的方法码。

非常感谢您的建议。