如何在JavaScript中检查变量是否为数组?
if (variable.constructor == Array)
如何在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恢复在线时,原始链接保持不变。
其他回答
我刚想到的:
if(项目长度)//这是一个数组其他的//不是数组
当我发布这个问题时,我使用的JQuery版本没有包含isArray函数。如果是这样的话,我可能会使用它,相信该实现是执行这种特定类型检查的最佳浏览器独立方式。
因为JQuery现在确实提供了这个功能,所以我会一直使用它。。。
$.isArray(obj);
(自1.6.2版起)它仍然使用以下形式的字符串比较来实现
toString.call(obj) === "[object Array]"
您还可以使用:
if (value instanceof Array) {
alert('value is Array!');
} else {
alert('Not an array');
}
在我看来,这是一个非常优雅的解决方案,但对每个人来说都是自己的。
编辑:
截至ES5,现在还有:
Array.isArray(value);
但这将在旧浏览器上打破,除非您使用的是polyfills(基本上…IE8或类似)。
我喜欢Brian的回答:
function is_array(o){
// make sure an array has a class attribute of [object Array]
var check_class = Object.prototype.toString.call([]);
if(check_class === '[object Array]') {
// test passed, now check
return Object.prototype.toString.call(o) === '[object Array]';
} else{
// may want to change return value to something more desirable
return -1;
}
}
但你可以这样做:
return Object.prototype.toString.call(o) === Object.prototype.toString.call([]);
代码引用自https://github.com/miksago/Evan.js/blob/master/src/evan.js
var isArray = Array.isArray || function(obj) {
return !!(obj && obj.concat && obj.unshift && !obj.callee);};