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


87

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

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

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

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

Answers:


164
  • 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方法是最有效的,但是它不如ES5代码那么短或可读性instanceof Array也不如Array.isArrayES5代码快,我倾向于避免将其用于可移植性。

我个人建议您尝试使用underscore,这是其中包含通用实用程序方法的库。它具有许多有用的功能,可以使您的代码干燥。


1
使用Node.js的util图书馆- require('util').isArray(arr) nodejs.org/api/util.html#util_util_isarray_object
拳皇

5
温馨提示,我们在节点v4.00及更高版本中不需要require('util')。isArray(arr)。已弃用
Sunil Khiatani

不知何故,在Node 10.x中看起来好像arr instanceof Array失败了。但是Array.isArray()作品很棒。
亚历克西斯·威尔克

71

试试这个代码:

Array.isArray(argument)

8

怎么样:

your_object instanceof Array

在Chrome的V8中,我得到了

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

7

我看起来这个问题有几个不错的答案,但是为了完整起见,我将添加另一个选项,之前没有建议过。

为了检查某物是否为数组,可以使用Node.jsutil本机模块及其isArray()功能。

例:

var util = require('util');

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

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


5
FWIW,util.isArray()目前代理到Array.isArray()github.com/joyent/node/blob/…–
Tom Spencer

0

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.