代码之家  ›  专栏  ›  技术社区  ›  Alex

检测传递的参数是否为数组?javascript[重复]

  •  46
  • Alex  · 技术社区  · 14 年前

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

    我有一个简单的问题:

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

    if (typeof paramThatCouldBeArray == 'array') 
    

    有可能吗?

    我该怎么做?

    事先谢谢。

    6 回复  |  直到 8 年前
        1
  •  64
  •   Casey Chu    8 年前
    if (param instanceof Array)
        ...
    

    编辑。 截至2016年,有一种现成的方法可以捕获更多的角落案例, Array.isArray ,用法如下:

    if (Array.isArray(param))
        ...
    
        2
  •  18
  •   James Westgate    14 年前

    这是jquery 1.4.2使用的方法:

    var toString = param.prototype.toString;
    var isArray = function(obj) {
            return toString.call(obj) === "[object Array]";
        }
    
        3
  •  5
  •   Germán Rodríguez    14 年前

    我找到这个了 here :

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

    也是这个

    function isArray(obj) {
        return (obj.constructor.toString().indexOf(”Array”) != -1);
    }
    
        4
  •  1
  •   outis    14 年前

    你可以测试 constructor 属性:

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

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

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

    除非它们也定义了构造函数:

    Stack.prototype.constructor = Stack;
    

    或:

    function Stack() {
        this.constructor = Stack;
    }
    
        5
  •  1
  •   Christian C. Salvadó    14 年前

    一些 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]] 内部属性)。

        6
  •  -1
  •   Ionuț G. Stan    14 年前

    鸭子打字

    实际上,不一定要检查对象是否是数组。你应该 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) 将转换为一个数组,每个对象公开一个 长度 属性。对于字符串,例如:

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

    好吧,这项技术在IE6上不太管用(我不知道以后的版本),但是很容易创建一个小的实用函数来转换数组中的对象。