JavaScript中的参数数组(ES5)

JavaScript中的参数数组(ES5),javascript,arrays,arguments,Javascript,Arrays,Arguments,也许这不是我的工作:/很简单,我想给一个数组作为参数,给一个函数作为参数数组: function add() { var sum = 0; for (var i = 0; i < arguments.length; i++) { sum += arguments[i]; } return sum; } 但如果我填充一个数组并将其作为参数,比如: var myNumbers = []; for (var i=0; i<100; i++)

也许这不是我的工作:/很简单,我想给一个数组作为参数,给一个函数作为参数数组:

function add() {
    var sum = 0;
    for (var i = 0; i < arguments.length; i++) {
        sum += arguments[i];
    }
    return sum;
}
但如果我填充一个数组并将其作为参数,比如:

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

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

但在这里:

add(myNumbers);
…您正在使用一个参数调用
add
,该参数是一个数组。位于
参数[0]

您需要编写
add
,以适应您想要调用它的方式。如果您想要使用离散参数调用它,请按照您已有的方式编写。如果您想要编写它以接受数组,请让它接受单个参数并循环该参数(即数组):


旁注:
参数
不是数组,它只是数组。

这里:

add(1,2,3,4,5,6);
…您正在使用一系列离散(单独)参数调用
add
,每个参数都显示在
参数
伪数组中,1个在
参数[0]
,2个在
参数[1]
,等等

但在这里:

add(myNumbers);
…您正在使用一个参数调用
add
,该参数是一个数组。位于
参数[0]

您需要编写
add
,以适应您想要调用它的方式。如果您想要使用离散参数调用它,请按照您已有的方式编写。如果您想要编写它以接受数组,请让它接受单个参数并循环该参数(即数组):



旁注:
arguments
不是数组,它只是一个类似数组的对象。

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

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

function add(arr) {
    var sum = 0;
    for (var i = 0; i < arr.length; i++) {
        sum += arr[i];
    }
    return sum;
}
功能添加(arr){
var总和=0;
对于(变量i=0;i
如果您想支持这两种情况,根据您的评论,您可以执行以下操作:

function add() {
    var arr = [].concat.apply([], arguments);
    var sum = 0;
    for (var i = 0; i < arr.length; i++) {
        sum += arr[i];
    }
    return sum;
}
函数添加(){
var arr=[].concat.apply([],参数);
var总和=0;
对于(变量i=0;i
解释
[].concat.apply([],参数)

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

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

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

function add(arr) {
    var sum = 0;
    for (var i = 0; i < arr.length; i++) {
        sum += arr[i];
    }
    return sum;
}
功能添加(arr){
var总和=0;
对于(变量i=0;i
如果您想支持这两种情况,根据您的评论,您可以执行以下操作:

function add() {
    var arr = [].concat.apply([], arguments);
    var sum = 0;
    for (var i = 0; i < arr.length; i++) {
        sum += arr[i];
    }
    return sum;
}
函数添加(){
var arr=[].concat.apply([],参数);
var总和=0;
对于(变量i=0;i
解释
[].concat.apply([],参数)

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

你可以用


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

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);

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

在第二种情况下,myNumbers是一个数组(因此请尝试在add function中以参数[0]的形式访问)。在第二种情况下,myNumbers是一个数组(因此尝试在add function中以参数[0]的形式访问)。谢谢,我应该如何修改add函数,以便两者都能工作?@Lonely:您可以通过(这是新的,但对于较旧的浏览器很容易填充)。然后使用第一个参数或
参数
。我添加了一个示例。谢谢,我应该如何修改add函数,以便两个
 function add() {
        var arr= Array.prototype.slice.call(arguments);
        arr = [].concat.apply([], arr);

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