【问题标题】:Arguments Array in JavaScript (ES5)JavaScript (ES5) 中的参数数组
【发布时间】:2017-06-14 05:44:51
【问题描述】:

也许那不是我的晚上:/ 很简单的事情,我想将一个数组作为参数给一个函数作为参数数组:

function add() {
    var sum = 0;
    for (var i = 0; i < arguments.length; i++) {
        sum += arguments[i];
    }
    return sum;
}

以下作品:

console.log(add(1,2,3,4,5,6));

但如果我填充一个数组并将其作为参数提供,例如:

var myNumbers = [];
for (var i=0; i<100; i++){
    myNumbers.push(i);
}
console.log(add(myNumbers));

我遇到了麻烦。我想,我错过了arguments 数组的一些重要内容。

我应该如何更改添加功能,以便两种可能性都可以使用?

【问题讨论】:

  • 在第二种情况下,myNumbers 是 add 函数中的一个数组(因此请尝试作为参数 [0] 访问)

标签: javascript arrays arguments


【解决方案1】:

arguments 对象是类数组对象,但它不是数组。它用于表示传递给函数的所有参数。您只向函数传递了一个值,因此您的数组实际上位于 arguments 对象的索引 0 处。

但是,在这里使用arguments 确实没有多大意义,除非您需要在不定义显式 API 的情况下动态处理事情。只需在 add 函数中声明您的参数即可。

function add(arr) {
    var sum = 0;
    for (var i = 0; i < arr.length; i++) {
        sum += arr[i];
    }
    return sum;
}

如果您想支持这两种情况,根据您的评论,您可以执行以下操作:

function add() {
    var arr = [].concat.apply([], arguments);
    var sum = 0;
    for (var i = 0; i < arr.length; i++) {
        sum += arr[i];
    }
    return sum;
}

解释 [].concat.apply([], arguments)

  • [].Array.prototype 的简写,因为它是一个空数组。
  • concat 将两个或多个数组合并在一起,或者将一个数组和值合并到数组中。
  • arguments 不是一个数组,但由于对象索引项和length 属性的一些类似数组的特性,许多原型函数都可以使用它。
  • apply 调用具有给定上下文(this 绑定)和任意数量参数的函数。在这种情况下,我们仍然希望将数组用作this 值以便能够调用concat,然后是我们传递给add 的所有参数。结果只是将所有参数作为正确的数组。

【讨论】:

  • 谢谢,我应该如何修改add函数,让两者都起作用?
  • @Lonely 查看可以处理这两种情况的更新答案。
  • 是 'var arr = [].concat.apply([], arguments);'跨浏览器兼容?
  • 是的,它只是Array.prototype.concat 的简写。
  • ES6 提供Array.from(arguments);
【解决方案2】:

此解决方案适用于两种情况:

function add() {
    var arr= Array.prototype.slice.call(arguments);
    arr = [].concat.apply([], arr);

    var sum = 0;
    for (var i = 0; i < arr.length; i++) {
      sum += arr[i];
    }
    return sum;
}

也是 sum 的简单解决方案:

 function add() {
        var arr= Array.prototype.slice.call(arguments);
        arr = [].concat.apply([], arr);

        return arr.reduce(function(f, s){return f + s;}, 0);
    }

【讨论】:

    【解决方案3】:

    您可以使用apply

    add.apply(null, [1,2,3])
    

    【讨论】:

      【解决方案4】:

      这里:

      add(1,2,3,4,5,6);
      

      ...您正在使用一系列 离散(单独的)参数调用 add,它们中的每一个都显示在 arguments 伪数组中,1 在 arguments[0] , 2 arguments[1], 等等。

      但是在这里:

      add(myNumbers);
      

      ...您使用 one 参数调用add,该参数是一个数组。那是arguments[0]

      您需要编写add 以适应您的称呼方式。如果您想使用离散参数调用它,请按照您的方式编写。如果你想写它来接受一个数组,让它接受一个参数并循环遍历它(这将是数组):

      function add(args) {
          //       ^------------- the one argument
          var sum = 0;
          for (var i = 0; i < args.length; i++) {
              sum += args[i];
          }
          return sum;
      }
      

      如果你想同时处理两者,你可以使用Array.isArray(新的,但是可以调整)来检查第一个参数是否是一个数组,如果是就使用它或者使用@ 987654334@如果不是:

      function add(args) {
          if (!Array.isArray(args)) {
              args = arguments;
          }
          var sum = 0;
          for (var i = 0; i < args.length; i++) {
              sum += args[i];
          }
          return sum;
      }
      

      旁注:arguments 不是数组,它只是 类数组

      【讨论】:

      • 谢谢,我应该如何修改add函数,让两者都起作用?
      • @Lonely:您可以通过Array.isArray 检测第一个参数是否是一个数组(这很新,但对于旧浏览器来说很容易填充)。然后要么使用第一个参数,要么使用arguments。我添加了一个示例。
      猜你喜欢
      • 2017-05-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-10
      相关资源
      最近更新 更多