这个问题已经在此处有答案︰

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

我发现了一个可能的解决方案...

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

这是进行这种的最佳方式?

2009-04-20 09:02:59
问题评论:

检查的对象是一个数组具有某些特定的忠告...Peter 先生的答案是应该使用的唯一一个。

似乎我的答案不是最好的 @Andy。也许应选择不同的答案,如接受?

好点的彼得。我从未 realised 接收您的回答像这样的意见。我认为我有多长时间后开始使用 JQuery.isArray 函数,当检查对于数组,以及值得注意的是以不同的方式实现对其他任何给定此处回答。我已经标记为流行为正确答案。

很抱歉,不对。我查阅了一些更深层次和 JQuery 仍然类型 (从版本 1.6.2) 检查...在窗体中使用比较 toString.call(obj) ==="[对象数组]"

IE8 支持我这样做if ('push' in variable.__proto__),检查某些 var 是数组的最快和也许最好的方法。

回答:

有多种方法可以检查,如果一个变量是一个数组或不。最好的解决方案是选择了。

variable.constructor === Array

这是所有其他浏览器的上铬,以及最有可能的最快方法。所有数组都是对象,所以检查构造函数属性是一个 JavaScript 引擎的快速过程。

如果您有问题找出如果一个对象的属性一个数组,必须首先检查属性是否存在。

variable.prop && variable.prop.constructor === Array

有一些其他方法︰

variable instanceof Array

此方法运行有关 1/第三与第一个示例的速度。如果你关于漂亮的代码,并不至于这样对性能仍然很稳固的、 看起来更整洁。更新︰ instanceof这现在是 2/3 的速度 !但是,对于那些要求其成为一站式服务,它并不适用于数字。

Array.isArray(variable)

这最后一项,在我看来 ugliest,它是最慢的一个。大约 1/5 的运行速度与第一个示例。Array.prototype,是真正的数组。您可以阅读更多有关它这里https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/isArray

因此另一个更新

Object.prototype.toString.call(variable) === '[object Array]';

这位专家是速度最慢的尝试检查数组。但是,这是您正在寻找任何类型的一站式服务。但是,由于您正在寻找一个数组,只需使用上面的最快方法。

同样,运行在 jsperf.com http://jsperf.com/instanceof-array-vs-array-isarray/33的测试因此享受其中的乐趣,并将其签出。

扩展的给定的回答另一个jsperf 在此处测试使用功能测试 (.push & &.pop) 即方式可最快,并支持在所有浏览器中 (即使旧的)。问题是可能对象不是数组具有推和弹出式属性。此外请注意,如果测试时创建的对象的数组 (或传递) 从另一个帧,大部分测试将会失败 (因为数组中给定的窗口是框架窗口中的数组的不同)。也有一个问题如果数组构造通过新阵列或 literaly 作为 [.]

令人感兴趣,我将不得不做更多的浏览器测试。在 centos 7 38 镶边有推 & 和 pop 作为构造函数,然而,铬 39 在 windows 8 具有构造函数,尽可能最快没有接近比较构造函数运行 70%比推快 10%& & pop。我只是等着一些更多的测试,要进来,感谢 !

因为这些都是常见的值/对象不具有一个构造函数,请注意,如果您不确信如果变量定义,或它可能是空的一定要做那些将首先检查。

我只被关注的数组部分。您可以轻松地variable && variable.constructor === Array,以确保该变量不为空或未定义。

Adicional 方法︰ !!~variable.constructor.toString().indexOf('Array()')variable.constructor.toString() == Array().constructor.toString() (很可能会稍微有点慢) 和Object.prototype.toString.call(variable) == '[object Array]'

您也可以使用︰

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

这看起来对我相当简洁的解决方案,但于每个他自己。

我建议,实际上坚持如果不使用多个框架,仍坚持使用该"instanceof"运算符。这是检查对象类型的正确的方式。

这将会失败的一个例子是如果您试图为数组或对象测试由于Array instanceof Object == true.

如果您正在使用 jQuery 传递与 find('code') 或类似要检查变量与variable instanceof Object,因为它不是为数组实例的元素。

如果您仍处于活动状态,您可能会更新您的答案,以反映截至 ES5 我们有 Array.isArray @BrettBender?

@AndrewK 请参阅Fela Winkelmolen 答案,有的 Array.isArray 方法。与此答案,它可能不是变形到通过编辑不同答案的答案是什么好主意。

我注意到有人提及 jQuery,但我不知道没有了isArray()函数。事实证明在 1.3 版中添加了它。

jQuery 实现它如彼得所示︰

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

让已经 jQuery (特别是跨浏览器兼容性及其技术) 中投入了大量的信仰我将可以升级到版本 1.3 并使用功能 (提供升级不会引起太多的问题),或直接在代码中使用此建议的方法。

许多感谢您的建议。

看到这篇文章讨论的主题。结论是使用此解决方案。

这使我错误 SCRIPT65535 IE10 中。

有多个解决方案所有他们自己的特点。此页提供了很好地概括。一个可能的解决方案是︰

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

如果您仔细阅读,它说当您正在使用多帧的文档,建议不要使用时需要此方法。此方法可以 easly borke"toString"函数中稍作修订。

该链接将两会以便 Brett 可以签出并查看其函数必须处理这种情况下

@icCube 请告诉为什么它不是路要走 !

请参阅我下面的答案。我建议 Peter Smit 的方式。

此方法是Mozilla 的建议.

这是一个旧的问题,但有相同的问题我找到一个很巧妙的解决方案,我想要共享。

向数组添加原型使得非常简单

Array.prototype.isArray = true;

现在一次有一个对象是否测试,以确定其需要所有的数组是检查是否有新的属性

var box = doSomething();

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

isArray 才可用如果其数组

@Vitimtk 的原型作为后备的实际对象,所以这应该工作,即使阵列问题已经存在。前处理的源代码行,当然,它不起作用。

假设没有人 does Object.prototype.isArray = true;! :(

让我 lol 的 @ErikE。this.trollcode = true

请注意 ES5 Array.isArray ,是一种方法 (如Array.isArray([1,2,3]) === true) 因此 @ErikE 不正在 troll。将避免此答案之后它会破坏代码有些现代浏览器中。

@Ibu,您可以执行{}.isArray === true与我"解决方案",这是整个点...

请输入您的翻译

How do you check if a variable is an array in JavaScript? [duplicate]

确认取消