如何在JavaScript中检查变量是否为数组?
if (variable.constructor == Array)
如何在JavaScript中检查变量是否为数组?
if (variable.constructor == Array)
当前回答
由于.length属性对于javascript中的数组是特殊的,因此可以简单地说
obj.length === +obj.length // true if obj is an array
Undercorejs和其他几个库使用这个简单的技巧。
其他回答
当我发布这个问题时,我使用的JQuery版本没有包含isArray函数。如果是这样的话,我可能会使用它,相信该实现是执行这种特定类型检查的最佳浏览器独立方式。
因为JQuery现在确实提供了这个功能,所以我会一直使用它。。。
$.isArray(obj);
(自1.6.2版起)它仍然使用以下形式的字符串比较来实现
toString.call(obj) === "[object Array]"
我在这里尝试了大多数解决方案。但没有一个有效。然后我提出了一个简单的解决方案。希望它能帮助某人并节省他们的时间。
if(variable.constructor != undefined && variable.constructor.length > 0) {
/// IT IS AN ARRAY
} else {
/// IT IS NOT AN ARRAY
}
对于那些编码高尔夫的人来说,这是一个字符最少的不可靠测试:
function isArray(a) {
return a.map;
}
这通常在遍历/展平层次结构时使用:
function golf(a) {
return a.map?[].concat.apply([],a.map(golf)):a;
}
input: [1,2,[3,4,[5],6],[7,[8,[9]]]]
output: [1, 2, 3, 4, 5, 6, 7, 8, 9]
我个人喜欢彼得的建议:https://stackoverflow.com/a/767499/414784(对于ECMAScript 3。对于ECMAScript 5,请使用Array.isArray())
然而,帖子上的评论表明,如果toString()被更改,那么检查数组的方法将失败。如果您真的想具体一些,并确保toString()没有更改,并且objects类属性([objectArray]是数组对象的类属性)没有问题,那么我建议您这样做:
//see if toString returns proper class attributes of objects that are arrays
//returns -1 if it fails test
//returns true if it passes test and it's an array
//returns false if it passes test and it's not an array
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;
}
}
注意,在JavaScript《最终指南》第6版7.10中,它说Array.isArray()是使用ECMAScript 5中的Object.pr原型.toString.call()实现的。还要注意,如果您要担心toString()的实现发生变化,那么您也应该担心其他内置方法也会发生变化。为什么使用push()?有人可以改变它!这种做法很愚蠢。上面的检查是为那些担心toString()更改的人提供的解决方案,但我认为检查是不必要的。
如果您只处理EcmaScript 5及以上版本,那么可以使用内置的Array.isArray函数
例如。,
Array.isArray([]) // true
Array.isArray("foo") // false
Array.isArray({}) // false