在Javascript中检查对象是否为数组的最佳方法是什么?

What is the best way to check if an object is an array or not in Javascript?

假设我有这样的功能:

1
2
3
4
5
6
7
function foo(bar) {
    if (bar > 1) {
       return [1,2,3];
    } else {
       return 1;
    }
}

假设我调用foo(1),我怎么知道它是否返回数组?


我使用这个函数:

1
2
3
function isArray(obj) {
  return Object.prototype.toString.call(obj) === '[object Array]';
}

是jquery.isarray的实现方式。

检查本文:

  • 伊萨雷:为什么这么血腥很难纠正?


1
2
3
4
if(foo(1) instanceof Array)
    // You have an Array
else
    // You don't

更新:我必须对下面的评论作出回应,因为人们仍然声称,如果不亲自尝试,这是行不通的…

对于其他一些对象,此技术不起作用(例如,"instanceof string==false"),但对数组有效。我在IE6、IE8、FF、Chrome和Safari中测试过。在下面评论之前,你自己试试看。


这里有一个非常可靠的方法,从javascript中获取:好的部分,由O'Reilly发布:

1
2
if (my_value && typeof my_value === 'object' &&  typeof my_value.length === 'number' &&
!(my_value.propertyIsEnumerable('length')) { // my_value is truly an array! }

我建议将其包装在您自己的功能中:

1
2
3
4
5
6
7
function isarray(my_value) {

    if (my_value && typeof my_value === 'object' &&  typeof my_value.length === 'number' &&
        !(my_value.propertyIsEnumerable('length'))
         { return true; }
    else { return false; }
}


从ES5开始,有isArray

1
Array.isArray([])  // true

为了使您的解决方案更通用,您可能不关心它是否实际上是一个数组对象。例如,document.getElementsByName()返回一个"类似于数组"的对象。如果对象具有"长度"属性,则可以假定"数组符合性"。

1
2
3
function is_array_compliant(obj){
    return obj && typeof obj.length != 'undefined';
}