49

可能重复:
如何检测变量是否为数组

我有一个简单的问题:

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

if (typeof paramThatCouldBeArray == 'array') 

那么有可能吗?

我该怎么做?

提前致谢。

4

6 回答 6

70
if (param instanceof Array)
    ...

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

if (Array.isArray(param))
    ...
于 2010-05-04T05:42:09.717 回答
19

这是 jQuery 1.4.2 使用的方法:

var toString = param.prototype.toString;
var isArray = function(obj) {
        return toString.call(obj) === "[object Array]";
    }
于 2010-05-04T05:45:30.160 回答
5

我在这里找到了这个:

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

还有这个

function isArray(obj) {
    return (obj.constructor.toString().indexOf(”Array”) != -1);
}
于 2010-05-04T05:41:44.817 回答
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]]内部属性)。

于 2010-05-04T06:17:04.717 回答
1

您可以测试该constructor属性:

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

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

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

除非他们还定义了构造函数:

Stack.prototype.constructor = Stack;

或者:

function Stack() {
    this.constructor = Stack;
}
于 2010-05-04T05:41:29.593 回答
-1

鸭打字

实际上,您不一定要检查对象是否为数组。您应该回避键入它,并且您希望该对象实现的唯一内容就是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 上不太适用(我不知道以后的版本),但是很容易创建一个小的实用程序函数来转换数组中的对象。

于 2010-05-04T08:56:44.870 回答