javascript - javascript如何检查变量是否是数组?

  显示原文与译文双语对照的内容

这个问题已经有了如下答案:

我想检查一个变量是数组还是JavaScript中的单个值。

我找到了一个可能的解决方案。。


if (variable.constructor == Array)...

这是最好的方法?

时间:

你也可以使用:


if (value instanceof Array) {
alert('value is Array!');
} else {
alert('Not an array');
}

对于我来说,这似乎是一个非常优雅的解决方案,但对于每个人来说。

我注意到有人提到了 jQuery,但我不知道有一个 isArray() 函数。 结果是它是在 1.3版本中添加的。

jQuery像Peter建议的那样实现它:


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

有jQuery已经 1.3 ( 特别是他们的跨浏览器 兼容性技术) 我会要么升级到版本中加入过多的信念和我的代码中直接使用它的函数( 提供升级不会造成太多问题) 或者使用这里建议的方法。

感谢你的建议。

有多个解决方案,它们都有自己的怪癖。 这里网页提供了很好的概述。 一个可能的解决方案是:


function isArray(o) {
 return Object.prototype.toString.call(o) === '[object Array]'; 
}

这是一个老问题,但要有同样的问题我找到了一个非常优雅的设计,我想分享。

将Prototype添加到数组使它的非常简单


Array.prototype.isArray = true;

在一种新的现在property,一旦如果你有一个目标要测试,看看它的所有你需要的是数组检查


var box = doSomething();

if (box.isArray) {
//do something
}

isArray仅在数组中可用时才可用

通过 Crockford编辑器:


function typeOf(value) {
 var s = typeof value;
 if (s === 'object') {
 if (value) {
 if (value instanceof Array) {
 s = 'array';
 }
 } else {
 s = 'null';
 }
 }
 return s;
}

主要失败的Crockford提到无法正确确定在不同上下文 比如,window 中创建的数组。 如果该页面不够复杂,则该页面有一个更复杂的版本。

我个人喜欢peter的建议: http://stackoverflow.com 767499/414784 web ( 用于 ECMAScript 3 。 对于 ECMAScript 5,使用 Array.isArray() )

但是,帖子的评论表明如果 toString() 完全改变,那么检查数组的方法将会失败。 如果你真的想要明确,并确保 toString() 没有被更改,并且对象类属性( [object Array] 是一个数组的对象的类属性) 没有问题,那么我建议这样做:


//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() 是使用 Object.prototype.toString.call() 中的实现的。 还要注意,如果你要担心 toString() 实现的变化,你也应该考虑其他构建方法的变化。 为什么使用 push()有人可以更改它? ! 这种方法很愚蠢。 上面的检查是为那些担心 toString() 变化的人提供的解决方案,但我相信这个检查是不必要的。

在现代浏览器中你可以做

 
Array.isArray(obj)

 

( 支持 Chrome 5,Firefox 4.0,IE 9,Opera 10.5和 Safari 5 )

为了向后兼容,你可以添加以下内容


# 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) 或者 $.isArray(obj) 。 如果你使用下划线,你可以使用 _.isArray(obj)

如果你不需要检测在不同帧中创建的数组,你也可以使用 instanceof

 
obj instanceof Array

 

注意: arguments的关键字,可以将它用于访问该参数并指定一个函数不是数组,尽管它( 通常通常) 作用和1:


var func = function() {
 console.log(arguments)//[1, 2, 3]
 console.log(arguments.length)//3
 console.log(Array.isArray(arguments))//false!!!
 console.log(arguments.slice)//undefined (Array.prototype methods not available)
 console.log([3,4,5].slice)//function slice() { [native code] } 
}
func(1, 2, 3)

当我发布这个问题时,我使用的JQuery版本没有包含 isArray 函数。 如果它有我想可能刚刚用它信任该实现来选择是最好的浏览器我们两种方式来执行这个特定的类型检查。

既然JQuery现在提供了这个功能,我总是使用它。

 
$.isArray(obj);

 

在版本 1.6.2中,它仍然通过对字符串中字符串的比较来实现


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

如果你只处理 EcmaScript 5和更高版本,那么你可以使用内置的Array.isArray 函数

例如,


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

...