关于 Array.reduce() 的奇怪函数

Weird function about Array.reduce()

我有以下代码和平:

const reducedValue = array.reduce((acc, curr) => {
    if (decision(curr)){
        return acc++;
    }
    return acc;
}, 0);

console.log(samApples) 总是 0 时,即使 decision 多次 true 也是如此。但是,当我更改为 acc += 1 时,效果很好。

为什么会这样?

如果在变量(Y++ - 后缀)之后使用 ++ 运算符 returns 值,然后递增它。如果在值(++Y - 前缀)之前使用,它会递增,然后 returns 它:

let x = 1, y = 1;

console.log(x++); // returns x then increments

console.log(++y); // increments y and then returns it

但是,您不需要增加累加器,return 而是新值:

const reducedValue = array.reduce((acc, curr) => 
  acc + (decision(curr) ? 1 : 0)
, 0);

并且由于您可以使用一元运算符 + 将布尔值转换为数字,因此您可以将其缩短为:

const reducedValue = array.reduce((acc, curr) => 
  acc + decision(curr) // acc + +decision(curr) in typescript
, 0);

这是因为 ++ 运算符的工作原理。当您执行 x++ x 时,在您当前操作之后递增,在您的情况下为 return 并且由于原始类型作为值而不是作为函数参数的引用传递,因此增量为在 return 之后处理并且不会结转到下一次迭代。

相反,+= 会立即执行,因此会在任何其他操作之前执行。这就是为什么这样做的原因。但是,如果您更喜欢使用 ++ 语法,请像这样使用它:++x,因为此操作是在 return 之前执行的(并且与 += 1 完全一样)。


另请查看 MDN 上的这个(可以说是更好的)描述: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Increment#description


还有一点概念证明:

const val = [1,2,3,4,5,6].reduce((acc, curr) => {
   return ++acc;
}, 0);

console.log(val)