如何在JavaScript中检查变量是否为数组?
if (variable.constructor == Array)
如何在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恢复在线时,原始链接保持不变。