检测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一个小的实用函数来转换数组中的对象。