我有一个简单的问题:
如何检测传递给我的javascript函数的参数是否为数组?我不相信我可以测试:
if (typeof paramThatCouldBeArray == 'array')
有可能吗?
我该怎么做?
提前致谢。
答案 0 :(得分:65)
if (param instanceof Array)
...
编辑。截至2016年,有一个现成的方法可以捕获更多的角落案例Array.isArray
,使用方法如下:
if (Array.isArray(param))
...
答案 1 :(得分:18)
这是jQuery 1.4.2使用的方法:
var toString = param.prototype.toString;
var isArray = function(obj) {
return toString.call(obj) === "[object Array]";
}
答案 2 :(得分:5)
我发现了here:
function isArray(obj) {
return obj.constructor == Array;
}
也是这个
function isArray(obj) {
return (obj.constructor.toString().indexOf(”Array”) != -1);
}
答案 3 :(得分:1)
您可以测试constructor
属性:
if (param.constructor == Array) {
...
}
虽然这将包含具有数组原型的对象,
function Stack() {
}
Stack.prototype = [];
除非他们也定义构造函数:
Stack.prototype.constructor = Stack;
或:
function Stack() {
this.constructor = Stack;
}
答案 4 :(得分:1)
一些days ago我正在构建一个简单的类型检测函数,可能对您有用:
用法:
//...
if (typeString(obj) == 'array') {
//..
}
实现:
function typeString(o) {
if (typeof o != 'object')
return typeof o;
if (o === null)
return "null";
//object, array, function, date, regexp, string, number, boolean, error
var internalClass = Object.prototype.toString.call(o)
.match(/\[object\s(\w+)\]/)[1];
return internalClass.toLowerCase();
}
此函数的second variant更严格,因为它只返回ECMAScript规范中描述的对象类型(可能的输出值:"object"
,"undefined"
,"null"
,和"function"
,"array"
,"date"
,"regexp"
,"string"
,"number"
,"boolean"
"error"
,使用[[Class]]
内部财产)。
答案 5 :(得分:-1)
实际上,您不一定要检查对象是否为数组。您应duck type它,并且您希望该对象实现的唯一内容是length
属性。在此之后,您可以将其转换为数组:
var arrayLike = {
length : 3,
0: "foo"
};
// transform object to array
var array = Array.prototype.slice.call(arrayLike);
JSON.stringify(array); // ["foo", null, null]
Array.prototype.slice.call(object)
将转换为每个公开length
属性的对象的数组。例如,在字符串的情况下:
var array = Array.prototype.slice.call("123");
JSON.stringify(array); // ["1", "2", "3"]
嗯,这种技术并不适用于IE6(我不知道以后的版本),但很容易创建一个小实用程序函数来转换数组中的对象。