我想检查变量是 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 版并使用他们的功能(提供升级不会导致太多问题)或直接在我的使用这个建议的方法码。
非常感谢您的建议。