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

为什么不能对函数的参数调用数组方法?

  •  22
  • alex  · 技术社区  · 16 年前

    我有一个函数可以接受任意数量的参数…

    const getSearchFields = () => {        
        const joined = arguments.join('/'); 
    };
    

    我希望将所有参数的字符串传递给与 / 性格。我一直收到这个错误:

    args.join不是函数

    有人能告诉我我做错了什么吗?

    8 回复  |  直到 7 年前
        1
  •  45
  •   David Andres    16 年前

    arguments 是伪数组,不是真数组。这个 join 方法可用于数组。

    你需要欺骗:

    var convertedArray = [];
    
    for(var i = 0; i < arguments.length; ++i)
    {
     convertedArray.push(arguments[i]);
    }
    
    var argsString = convertedArray.join('/');
    

    与其他帖子类似,您可以速记以下内容:

    var argsString = Array.prototype.join.call(arguments, "/");
    
        2
  •  14
  •   Christian C. Salvadó    7 年前

    如上所述,arguments对象实际上不是一个数组,但是您可以通过访问array.prototype并使用执行它们来直接应用数组函数。 apply call 要更改上下文:

    var argsString = Array.prototype.join.call(arguments, '/');
    

    编辑 :由于9年前提出的原始问题被更新为使用ES6语法,我觉得现在需要提供ES6答案,因为语言提供了本地构造来处理这种情况。

    ES6标准介绍了 推广算子 ,您可以轻松使用它作为数组对象接收参数,例如:

    function sum(...numbers) {
      return numbers.reduce((sum, value) => sum + value);
    }
    
    console.log(sum(1,2,3,4)); // 10

    应用于您的示例:

    const getSearchFields = (...fields) => {        
      const joined = fields.join('/'); 
    };
    

    您还可以使用spread运算符进行函数调用,比如说您有一个数组,并且您想要调用一个函数,将数组的每个元素作为函数调用的参数传递,现在您可以简单地:

    function sum(a, b, c, d) {
      return a + b + c + d;
    }
    
    var array = [1, 2, 3, 4];
    console.log(sum(...array)); // 10

    此外,您还可以期待一些参数,并 休息 传递的参数 作为 最后的 定义的参数:

    function processList(first, ...rest) {
      // ...
    }
    

    还有更多的用途 传播 超出此问题范围的运算符,例如对象复制、在数组中展开数组等…

        3
  •  8
  •   user193130    11 年前

    如果您正在使用 jQuery 1.2 + ,您可以使用 $.makeArray() :

    将类似数组的对象转换为真正的javascript数组。

    从问题的例子中,只需使用这一行

    var args = $.makeArray(arguments);
    
        4
  •  5
  •   Russ Bradberry    16 年前

    参数实际上不是数组。

    试试这个:

    var args = [].splice.call(arguments,0);
    var argsString = args.join('/');
    
        5
  •  2
  •   alex    7 年前

    问题是 arguments 是一个 类数组对象 (它有编号的属性映射到传递的参数和 length 但实际上 不是吗? 数组。

    在过去,你可以用 Array.prototype.slice.call(arguments) (除其他方法外)。

    不过,现在我们更幸运了(当然取决于您所支持的平台)。你也可以…

    const getSearchFields = (...args) => {
       Array.isArray(args); // true
    };
    

    …或…

    const getSearchFields = () => {
       const args = Array.from(arguments);
       Array.isArray(args); // true
    };
    

    首选第一个示例,因为…

    • 在函数体中不需要额外步骤就可以创建普通数组。
    • 争论 是一个魔力变量(它没有明确定义,所以它是从哪里来的?)
    • 它有 funny behaviour with named args in non-strict mode (请注意,您应该 'use strict' )
    • 第一个例子有更清晰的意图(所有参数数组的创建都是明确的)。
        6
  •  0
  •   Cᴏʀʏ bcherry    16 年前

    arguments 不是javascript数组;它是一个特殊的对象,没有 join 方法。

        7
  •  -1
  •   user3198259    7 年前

    如果您在Angular4用户httpHeaders中发布HTTP请求时收到。请检查下面的答案。在调用httpheaders之后,问题就解决了。

    this.headers  = new HttpHeaders({ 'Authorization': token1, 'X-IBM-Client-Id': 'ddddddd' });
    

    values.join is not a function in the file http.es5.js Angular 4

        8
  •  -2
  •   alex    10 年前

    你必须给一个变量赋值,它才能工作。

    var a = ['Wind', 'Rain', 'Fire'];
    
    var myVar1 = a.join();
    
    var myVar2 = a.join(', ');
    
    var myVar3 = a.join(' + ');
    
    var myVar4 = a.join('');