没有具体的反应,所以希望可以问,但我认为传播操作符会使数组变平?
因此,使用以下sum函数对args求和,您可以使用.apply传递值:
function sum() {
return arguments.reduce((total, number) => total + number, 0);
}
var values = [2, 4, 8, 12, 16];
console.log(sum.apply(null, values));
我认为你可以添加函数并使用spread运算符来展平数组,以便可以使用调用。 (我知道你不会在这个例子中使用电话,但我只是感到惊讶,因为我认为传播使阵列变得平坦:
function sum() {
return [...arguments].reduce((total, number) => total + number, 0);
}
var values = [2, 4, 8, 12, 16];
console.log(sum.call(null, values));
返回字符串02,4,8,12,16
答案 0 :(得分:2)
这是因为arguments
与数组类似。数组将转换为字符串。
虽然这个函数的语法几乎与apply()的语法相同,但是根本区别在于call()接受一个参数列表,而apply()接受一个参数数组。
这应该按预期工作:
sum(...values);
sum.call(null, ...values);
sum.apply(null, values);
顺便说一下,在ES6中,arguments
和call
不受欢迎。
答案 1 :(得分:1)
arguments是一个类似于数组的数组,因此在将数组作为参数传递时,结构就像一个嵌套数组。因此,应用spread运算符会生成格式为[[2, 4, 8, 12, 16]]
的数组(即[...[[2, 4, 8, 12, 16]]]
),reduce方法应用0 + [2, 4, 8, 12, 16]
,结果为"02,4,8,12,16"
。
要使其工作,您需要使用Function#apply
将数组值作为参数传递或获取第一个参数。
function sum() {
return [...arguments].reduce((total, number) => total + number, 0);
}
var values = [2, 4, 8, 12, 16];
console.log(sum.apply(null, values));

function sum() {
return [...arguments][0].reduce((total, number) => total + number, 0);
}
var values = [2, 4, 8, 12, 16];
console.log(sum.call(null, values));