【问题标题】:What is the best way to check if an object is an array or not in Javascript?在Javascript中检查对象是否为数组的最佳方法是什么?
【发布时间】:2010-11-15 05:28:17
【问题描述】:

假设我有这样的功能:

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

假设我打电话给foo(1),我怎么知道它是否返回一个数组?

【问题讨论】:

  • 你让你的生活变得比它需要的更艰难。如果函数总是返回一个数组,我会认为它的风格更好。

标签: javascript arrays instanceof typeof


【解决方案1】:
if(foo(1) instanceof Array)
    // You have an Array
else
    // You don't

更新:我必须对下面的 cmets 做出回应,因为人们仍然声称如果不亲自尝试,这将无法工作......

对于其他一些对象,这种技术不起作用(例如 "" instanceof String == false),但这适用于 Array.我在 IE6、IE8、FF、Chrome 和 Safari 中对其进行了测试。 在下面发表评论之前,请亲自体验一下。

【讨论】:

  • 如果您通过new Array() 声明数组,则 有效,而不是使用[] 简写。请参阅上述 URL 下的“说明”部分。
  • 这不适用于不同的全球环境;就像 iframe 中的对象...
  • @Boldewyn,这不是真的。其他一些对象也是如此(例如“” instanceof String == false),但这适用于Array。试试看,自己看看。
  • @Josh Stodola,Object.prototype.toString 也可以。您几乎可以覆盖 js 中的所有内容,但您必须做出一些假设才能回答问题。
【解决方案2】:

我使用这个功能:

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

jQuery.isArray的实现方式。

查看这篇文章:

【讨论】:

  • 完美!我正在使用 jQuery,所以我将使用它。这篇文章也有帮助。
  • 在现代浏览器中我们有 Array.isArray 函数,所以最好写成 if !Array.isArray { ...这里是定义...}
【解决方案3】:

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

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

【讨论】:

  • 字符串也有一个“长度”属性。
  • 确实如此。因此,您还应该检查: typeof obj == "object"
【解决方案4】:

这是一种非常可靠的方法,取自 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; }
}

【讨论】:

  • 您可以只使用return 表达式的结果而不是if..else。 :P
【解决方案5】:

从 ES5 开始,有 isArray

Array.isArray([])  // true

【讨论】:

    猜你喜欢
    • 2011-03-20
    • 2011-03-27
    • 2018-08-17
    • 1970-01-01
    • 2020-06-27
    • 2020-12-08
    • 1970-01-01
    • 2012-06-17
    • 2010-09-12
    相关资源
    最近更新 更多