如何在JavaScript中检查变量是否为数组?
if (variable.constructor == Array)
如何在JavaScript中检查变量是否为数组?
if (variable.constructor == Array)
当前回答
我认为使用myObj.constructor==Object和myArray.constructor==Array是最好的方法。它几乎比使用toString()快20倍。如果您使用自己的构造函数扩展对象,并希望这些创建也被视为“对象”,那么这是行不通的,但否则它会更快。typeof与构造函数方法一样快,但typeof[]=='object'返回true,这通常是不可取的。http://jsperf.com/constructor-vs-tostring
需要注意的一点是null.constructor将抛出一个错误,因此如果您可能要检查null值,则必须首先执行以下操作:(testThing!==null){}
其他回答
这是一个老问题,但有同样的问题,我找到了一个非常优雅的解决方案,我想分享。
将原型添加到Array使其非常简单
Array.prototype.isArray = true;
现在,如果您有一个要测试的对象,看看它是否是一个数组,您只需要检查新属性
var box = doSomething();
if (box.isArray) {
// do something
}
isArray仅在其为数组时可用
我注意到有人提到jQuery,但我不知道有isArray()函数。原来它是在1.3版中添加的。
jQuery按照Peter的建议实现它:
isArray: function( obj ) {
return toString.call(obj) === "[object Array]";
},
我已经对jQuery很有信心(尤其是他们的跨浏览器兼容性技术),我要么升级到1.3版并使用他们的功能(前提是升级不会导致太多问题),要么直接在代码中使用建议的方法。
非常感谢您的建议。
通用解决方案如下:
Object.prototype.toString.call(obj)=='[object Array]'
从ECMAScript 5开始,正式的解决方案是:
Array.isArray(arr)
此外,对于旧的JavaScript库,您可以找到以下解决方案,尽管它不够准确:
var is_array = function (value) {
return value &&
typeof value === 'object' &&
typeof value.length === 'number' &&
typeof value.splice === 'function' &&
!(value.propertyIsEnumerable('length'));
};
解决方案来自http://www.pixelstech.net/topic/85-How-to-check-whether-an-object-is-an-array-or-not-in-JavaScript
您还可以使用:
if (value instanceof Array) {
alert('value is Array!');
} else {
alert('Not an array');
}
在我看来,这是一个非常优雅的解决方案,但对每个人来说都是自己的。
编辑:
截至ES5,现在还有:
Array.isArray(value);
但这将在旧浏览器上打破,除非您使用的是polyfills(基本上…IE8或类似)。
由于.length属性对于javascript中的数组是特殊的,因此可以简单地说
obj.length === +obj.length // true if obj is an array
Undercorejs和其他几个库使用这个简单的技巧。