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

时间:2009-07-29 20:30:18

标签: javascript arrays instanceof typeof

说我有这样的功能:

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

说我打电话给foo(1),我怎么知道它会返回一个数组呢?

5 个答案:

答案 0 :(得分:16)

我使用这个功能:

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

jQuery.isArray的实施方式。

查看这篇文章:

答案 1 :(得分:3)

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

更新:我必须回复下面的评论,因为人们仍然声称如果不自己尝试就行不行......

对于某些其他对象,此技术不起作用(例如“”instanceof String == false),但这适用于Array。我在IE6,IE8,FF,Chrome和Safari中进行了测试。 在下面发表评论之前尝试一下并亲眼看看。

答案 2 :(得分:2)

这是一种非常可靠的方式,取自Javascript:好的部分,由O'Reilly出版:

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

我建议将它包装在你自己的函数中:

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; }
}

答案 3 :(得分:1)

从ES5开始,有isArray

Array.isArray([])  // true

答案 4 :(得分:-1)

为了使您的解决方案更通用,您可能不关心它是否实际上是一个Array对象。例如,document.getElementsByName()返回一个“就像”一个数组的对象。如果对象具有“长度”属性,则可以假设“数组合规性”。

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