如何在JavaScript中检查变量是否为数组?

if (variable.constructor == Array)

当前回答

代码引用自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);};

其他回答

在现代浏览器(以及一些传统浏览器)中,您可以

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)

我注意到有人提到jQuery,但我不知道有isArray()函数。原来它是在1.3版中添加的。

jQuery按照Peter的建议实现它:

isArray: function( obj ) {
    return toString.call(obj) === "[object Array]";
},

我已经对jQuery很有信心(尤其是他们的跨浏览器兼容性技术),我要么升级到1.3版并使用他们的功能(前提是升级不会导致太多问题),要么直接在代码中使用建议的方法。

非常感谢您的建议。

如果您只处理EcmaScript 5及以上版本,那么可以使用内置的Array.isArray函数

例如。,

Array.isArray([])    // true
Array.isArray("foo") // false
Array.isArray({})    // false

代码引用自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);};

当我发布这个问题时,我使用的JQuery版本没有包含isArray函数。如果是这样的话,我可能会使用它,相信该实现是执行这种特定类型检查的最佳浏览器独立方式。

因为JQuery现在确实提供了这个功能,所以我会一直使用它。。。

$.isArray(obj);

(自1.6.2版起)它仍然使用以下形式的字符串比较来实现

toString.call(obj) === "[object Array]"