我应该如何检测参数是否为数组,因为typeof []
返回'object'
并且我想区分数组和对象。
对象可能看起来像{"0":"string","1":"string","length":"2"}
但我不希望它作为一个数组出来,如果它实际上是一个看起来像数组的对象。
JSON.parse
和JSON.stringify
能够做出这种区分。我该怎么办?
我使用的是基于V8的Node.JS,与Chrome相同。
答案 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())