括号内的数组如何工作?

时间:2018-05-26 14:47:35

标签: javascript

在Codefights中,我找到了解决其中一个挑战的解决方案:

alternatingSums = a => a.reduce((accum,value,i) => {
    accum[i&1] += value
    return accum
}, [0,0])

这给出了相同的结果:

const a = [1,2]

console.log( (a) ) // return [1,2]
console.log( (a,a) ) // return [1,2]
console.log( (a,a,a) ) // return [1,2]

console.log( (a[0]) ) // return 1
console.log( (a[0],a) ) // return [1,2]
console.log( (a[0],a,a) ) // return [1,2]

console.log( (a[0]+=1) ) // return 2, a[0] is incremented
console.log( (a[0]+=1,a) ) // return [3,2], a[0] is incremented
console.log( (a[0]+=1,a,a) ) // return [4,2], a[0] is incremented

我无法理解的部分是为什么在括号内包含两个数组会返回数组,并在正确的索引中添加了累积的数据。

我找不到任何关于此的文档,所以我做了一些实验,试图弄清楚它是如何工作的,但我仍然在努力解决这个问题:



{{1}}




1 个答案:

答案 0 :(得分:3)

  

我无法理解的部分是为什么在括号内包含两个数组会返回数组,并在正确的索引中添加了累积。

(accum,value,i)(accum[i&1] += value, accum)不是数组。数组使用[],而非()

(accum,value,i)arrow function的参数列表。我们知道,因为下一个标记是=>

(accum[i&1] += value, accum)是箭头功能的 body ,特别是简洁的身体。我们知道,因为它紧跟在=>之后,并且不以{开头(这将开始一个冗长的主体)。这个简洁的机构使用grouping operator (())表达式comma operator。逗号运算符是JavaScript更有趣的运算符之一:它计算其左侧操作数,抛出该值,然后计算其右侧操作数并将其作为结果值。在这里,它被用于更新accum[i&i]值的左手操作数的副作用

由于(accum[i&1] += value, accum)是构成箭头函数简洁体的表达式,因此其结果(accum)用作函数的返回值。

之后的代码块“这给出了相同的结果”是将箭头函数的简洁主体完美地翻译成具有return语句的详细正文(很好的!),并且完全相同的事情。