关于 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)
我有以下代码和平:
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)