可能重复:
如何检测变量是否为数组
我有一个简单的问题:
如何检测传递给我的 javascript 函数的参数是否是数组?我不相信我可以测试:
if (typeof paramThatCouldBeArray == 'array')
那么有可能吗?
我该怎么做?
提前致谢。
可能重复:
如何检测变量是否为数组
我有一个简单的问题:
如何检测传递给我的 javascript 函数的参数是否是数组?我不相信我可以测试:
if (typeof paramThatCouldBeArray == 'array')
那么有可能吗?
我该怎么做?
提前致谢。
if (param instanceof Array)
...
编辑。截至 2016 年,有一个现成的方法可以捕获更多的极端情况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]";
}
我在这里找到了这个:
function isArray(obj) {
return obj.constructor == Array;
}
还有这个
function isArray(obj) {
return (obj.constructor.toString().indexOf(”Array”) != -1);
}
几天前我正在构建一个简单的类型检测功能,也许它对你有用:
用法:
//...
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 规范中描述的对象类型(可能的输出值:"object"
, "undefined"
, "null"
, 和"function"
, "array"
, "date"
, "regexp"
, "string"
, "number"
, "boolean"
"error"
, 使用[[Class]]
内部属性)。
您可以测试该constructor
属性:
if (param.constructor == Array) {
...
}
虽然这将包括具有数组原型的对象,
function Stack() {
}
Stack.prototype = [];
除非他们还定义了构造函数:
Stack.prototype.constructor = Stack;
或者:
function Stack() {
this.constructor = Stack;
}
实际上,您不一定要检查对象是否为数组。您应该回避键入它,并且您希望该对象实现的唯一内容就是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 上不太适用(我不知道以后的版本),但是很容易创建一个小的实用程序函数来转换数组中的对象。