检测传递的参数是否为数组?使用Javascript

时间:2010-05-04 05:36:02

标签: javascript arrays arguments parameter-passing

  

可能重复:
  How to detect if a variable is an array

我有一个简单的问题:

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

if (typeof paramThatCouldBeArray == 'array') 

有可能吗?

我该怎么做?

提前致谢。

6 个答案:

答案 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(我不知道以后的版本),但很容易创建一个小实用程序函数来转换数组中的对象。