JavaScript中的参数数组(ES5)

时间:2017-01-28 17:29:14

标签: javascript arrays arguments

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

$HOME

以下作品:

PYTHONPATH=$HOME/test

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

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)); 数组的重要内容。

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

4 个答案:

答案 0 :(得分:2)

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

但是,除非您需要在不定义显式API的情况下动态处理事物,否则使用arguments的确没有多大意义。只需在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的所有参数。结果只是所有参数都是正确的数组。

答案 1 :(得分: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;
}

总和的简单解决方案:

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

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

答案 2 :(得分:1)

下面:

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

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

但是在这里:

add(myNumbers);

...您正在使用一个参数调用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(新的,但可以调整)来检查第一个参数,看看它是否是一个数组,并使用它如果是,或者使用arguments,如果它不是:

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不是数组,它只是类似数组

答案 3 :(得分:1)

您可以使用apply

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