我应该如何检测参数是否为数组,因为typeof []
return,'object'
并且我想区分数组和对象。
该对象可能看起来像,{"0":"string","1":"string","length":"2"}
但如果它实际上是一个看起来像数组的对象,我不希望它作为数组出现。
JSON.parse
并JSON.stringify
能够做出这种区分。我该怎么做?
我正在使用与Chrome相同的基于V8的Node.JS。
Answers:
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.isArray
ES5代码快,我倾向于避免将其用于可移植性。
我个人建议您尝试使用underscore
,这是其中包含通用实用程序方法的库。它具有许多有用的功能,可以使您的代码干燥。
arr instanceof Array
失败了。但是Array.isArray()
作品很棒。
我看起来这个问题有几个不错的答案,但是为了完整起见,我将添加另一个选项,之前没有建议过。
为了检查某物是否为数组,可以使用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标准,因为它将始终显示正确的答案。
util
图书馆-require('util').isArray(arr)
nodejs.org/api/util.html#util_util_isarray_object