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

Bry*_*eld 84 javascript arrays typeof object node.js

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

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

JSON.parse并且JSON.stringify能够做出这种区分.我该怎么做?

我使用的是基于V8的Node.JS和Chrome一样.

Ray*_*nos 158

  • 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]';
};
Run Code Online (Sandbox Code Playgroud)

此方法接受一个对象并Object.prototype.toString在其上调用该方法.这将始终返回[object Array]数组.

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

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

  • 温柔的提醒,请不要我们在节点v4.00及以上版本中要求('util').isArray(arr).它被弃用了 (5认同)

T-B*_*ull 64

试试这段代码:

Array.isArray(argument)
Run Code Online (Sandbox Code Playgroud)


小智 8

怎么样:

your_object instanceof Array
Run Code Online (Sandbox Code Playgroud)

在Chrome中的V8中我得到了

[] instanceof Array
> true
({}) instanceof Array
> false 
({"0":"string","1":"string","length":"2"}) instanceof Array
> false
Run Code Online (Sandbox Code Playgroud)


Tom*_*Tom 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
Run Code Online (Sandbox Code Playgroud)

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

  • FWIW,`util.isArray()`当前代理`Array.isArray()`:https://github.com/joyent/node/blob/95dbb6bf647d90947c0c738533dadf391559be98/lib/util.js#L508 (5认同)