JavaScript:检测参数是数组而不是对象(Node.JS)
我应该如何检测参数是否是一个数组,因为typeof []
返回'object'
,我想区分数组和对象。
对象可能看起来像{"0":"string","1":"string","length":"2"}
但我不希望它出来作为一个数组,如果它是实际上是一个像数组一样的对象。
JSON.parse
和JSON.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())