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

if (variable.constructor == Array)

当前回答

有多种解决方案都有其独特之处。本页提供了一个很好的概述。一种可能的解决方案是:

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

其他回答

您还可以使用:

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()更改的人提供的解决方案,但我认为检查是不必要的。

我已经创建了一小段代码,它可以返回真正的类型。

我还不确定性能,但这是一种正确识别类型的尝试。

https://github.com/valtido/better-typeOf也在这里写了一些关于它的博客http://www.jqui.net/jquery/better-typeof-than-the-javascript-native-typeof/

它的工作原理与当前类型的类似。

var user = [1,2,3]
typeOf(user); //[object Array]

它认为它可能需要一些微调,并且考虑到一些事情,我没有遇到或测试它。因此,无论是性能方面的改进,还是错误地重新移植类型of,都欢迎进一步的改进。

通用解决方案如下:

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

如果使用的是Angular,则可以使用Angular.isArray()函数

var myArray = [];
angular.isArray(myArray); // returns true

var myObj = {};
angular.isArray(myObj); //returns false

http://docs.angularjs.org/api/ng/function/angular.isArray