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

时间:2011-05-09 19:46:05

标签: javascript arrays object node.js typeof

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

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

JSON.parseJSON.stringify能够做出这种区分。我该怎么办?

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

5 个答案:

答案 0 :(得分:154)

  • Array.isArray

原生V8功能。这很快,总是正确的。这是ES5的一部分。

  • arr instanceof Array

检查对象是否是使用数组构造函数创建的。

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

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代码和我倾向于避免使用它来实现可移植性。

我个人建议您尝试使用underscore,这是一个包含常用实用程序方法的库。它有很多有用的功能可以干掉你的代码。

答案 1 :(得分:62)

试试这段代码:

Array.isArray(argument)

答案 2 :(得分:7)

怎么样:

your_object instanceof Array

在Chrome中的V8中我得到了

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

答案 3 :(得分:7)

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

为了检查某些内容是否为数组,您可以使用Node.js util本机模块及其isArray()函数。

实施例:

var util = require('util');

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

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

答案 4 :(得分:0)

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