也许那不是我的晚上:/非常简单的事情,我想将一个数组作为参数给作为参数数组的函数:
$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));
数组的重要内容。
我应该如何更改添加功能,以便两种可能性都适用?
答案 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])