ES6扩展运算符不会使阵列变平吗?

时间:2017-01-10 10:16:56

标签: javascript arrays ecmascript-6

没有具体的反应,所以希望可以问,但我认为传播操作符会使数组变平?

因此,使用以下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

2 个答案:

答案 0 :(得分:2)

这是因为arguments与数组类似。数组将转换为字符串。

作为call documentation says

  

虽然这个函数的语法几乎与apply()的语法相同,但是根本区别在于call()接受一个参数列表,而apply()接受一个参数数组。

这应该按预期工作:

sum(...values);
sum.call(null, ...values);
sum.apply(null, values);

顺便说一下,在ES6中,argumentscall不受欢迎。

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




参考:What is the difference between call and apply?