JavaScript:检测参数是数组而不是对象(Node.JS)

我应该如何检测参数是否是一个数组,因为typeof []返回'object' ,我想区分数组和对象。

对象可能看起来像{"0":"string","1":"string","length":"2"}但我不希望它出来作为一个数组,如果它是实际上是一个像数组一样的对象。

JSON.parseJSON.stringify能够做出这个区别。 我该怎么做?

我使用的基于V8的Node.JS与Chrome相同。

  • Array.isArray

原生V8function。 这很快,它总是正确的。 这是ES5的一部分。

  • arr instanceof Array

检查对象是否由数组构造函数创build。

  • _.isArray // underscore method.

从下划线的方法。 这是从他们的来源采取的片段

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

这个方法接受一个对象,并在其上调用Object.prototype.toString方法。 这总是会返回[object Array]

在我个人的经验中,我发现要求toString方法是最有效的,但它不像instanceof Array那么简短或不可读,也不像Array.isArray那么快,但这是ES5代码,我倾向于避免使用它来实现可移植性。

我个人build议你尝试使用underscore ,这是一个常用的实用工具库。 它有很多有用的function,干你的代码。

试试这个代码:

 Array.isArray(argument) 

怎么样:

 your_object instanceof Array 

在Chrome我得到的V8

 [] instanceof Array > true ({}) instanceof Array > false ({"0":"string","1":"string","length":"2"}) instanceof Array > false 

我看起来像这个问题有几个很好的答案,但为了完整性,我会添加另一个选项,这是以前没有build议的。

为了检查是否有数组,可以使用Node.js util native模块和isArray()函数。

例:

 var util = require('util'); util.isArray([]); // true util.isArray(new Array); // true util.isArray({"0":"string","1":"string","length":"2"}); // false 

使用这种方法,您不必担心由V8实现的JS标准,因为它始终会显示正确的答案。

试试这个方法:
console.log(Object.prototype.toString.call(arg).replace(/ ^ [object(。+)] $ /,'$ 1')。toLowerCase())