检测parameter passing是一个数组? Javascript

可能重复:
如何检测一个variables是否是一个数组

我有一个简单的问题:

如何检测传递给我的JavaScript函数的参数是否是数组? 我不相信我可以testing:

if (typeof paramThatCouldBeArray == 'array') 

那可能吗?

我该怎么做?

提前致谢。

 if (param instanceof Array) ... 

编辑。 截至2016年,有一个现成的方法,捕获更多的angular落情况, Array.isArray ,使用如下:

 if (Array.isArray(param)) ... 

这是jQuery 1.4.2使用的方法:

 var toString = param.prototype.toString; var isArray = function(obj) { return toString.call(obj) === "[object Array]"; } 

我在这里find了这个:

 function isArray(obj) { return obj.constructor == Array; } 

也是这一个

 function isArray(obj) { return (obj.constructor.toString().indexOf(”Array”) != -1); } 

前几天我正在build立一个简单的types检测function,可能对你有用:

用法:

 //... 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(); } 

该函数的第二个变体更为严格,因为它只返回ECMAScript规范中描述的对象types(可能的输出值: "object""undefined""null""function""array""date""regexp""string""number""boolean" "error" ,使用[[Class]]内部属性)。

您可以testingconstructor属性:

 if (param.constructor == Array) { ... } 

虽然这将包括具有数组原型的对象,

 function Stack() { } Stack.prototype = []; 

除非他们也定义构造函数:

 Stack.prototype.constructor = Stack; 

要么:

 function Stack() { this.constructor = Stack; } 

鸭子打字

其实,你不一定要检查一个对象是一个数组。 你应该input它,唯一你想要对象实现的是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属性。 例如在string的情况下:

 var array = Array.prototype.slice.call("123"); JSON.stringify(array); // ["1", "2", "3"] 

那么这个技术在IE6上并不是很有效(我不知道后面的版本),但是很容易创build一个小的实用函数来转换数组中的对象。