如何在JavaScript中检查变量是否为数组?
if (variable.constructor == Array)
如何在JavaScript中检查变量是否为数组?
if (variable.constructor == Array)
当前回答
我喜欢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([]);
其他回答
这是一个老问题,但有同样的问题,我找到了一个非常优雅的解决方案,我想分享。
将原型添加到Array使其非常简单
Array.prototype.isArray = true;
现在,如果您有一个要测试的对象,看看它是否是一个数组,您只需要检查新属性
var box = doSomething();
if (box.isArray) {
// do something
}
isArray仅在其为数组时可用
您还可以使用:
if (value instanceof Array) {
alert('value is Array!');
} else {
alert('Not an array');
}
在我看来,这是一个非常优雅的解决方案,但对每个人来说都是自己的。
编辑:
截至ES5,现在还有:
Array.isArray(value);
但这将在旧浏览器上打破,除非您使用的是polyfills(基本上…IE8或类似)。
我个人喜欢彼得的建议: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()更改的人提供的解决方案,但我认为检查是不必要的。
我认为使用myObj.constructor==Object和myArray.constructor==Array是最好的方法。它几乎比使用toString()快20倍。如果您使用自己的构造函数扩展对象,并希望这些创建也被视为“对象”,那么这是行不通的,但否则它会更快。typeof与构造函数方法一样快,但typeof[]=='object'返回true,这通常是不可取的。http://jsperf.com/constructor-vs-tostring
需要注意的一点是null.constructor将抛出一个错误,因此如果您可能要检查null值,则必须首先执行以下操作:(testThing!==null){}
由于.length属性对于javascript中的数组是特殊的,因此可以简单地说
obj.length === +obj.length // true if obj is an array
Undercorejs和其他几个库使用这个简单的技巧。