Javascript 带有否定和求和的Array.reduce()的奇怪行为

Javascript 带有否定和求和的Array.reduce()的奇怪行为,javascript,reduce,Javascript,Reduce,数据: 代码: 1. 但是 2. 问题: 为什么1。和2。不一样?对我来说毫无意义?如何减少()数组以获得与1中相同的结果 更新: arr.reduce((a, b) => (!a + !b)); // 1, bullshit?! try1:(为什么这不起作用?) 您在每次迭代中对上一个和求反,因此它将被视为1(true)或0(false) 它的工作原理如下: arr.reduce((a, b) => a.test + !b.test, {test: 0}); // NaN a

数据:

代码:

1. 但是

2. 问题: 为什么1。和2。不一样?对我来说毫无意义?如何减少()数组以获得与1中相同的结果


更新:

arr.reduce((a, b) => (!a + !b));
// 1, bullshit?!
try1:(为什么这不起作用?)


您在每次迭代中对上一个和求反,因此它将被视为
1
(true)或
0
(false)

它的工作原理如下:

arr.reduce((a, b) => a.test + !b.test, {test: 0});
// NaN

arr.reduce((a, b) => a.test + !b.test, 0);
//NaN

因此,使用method设置一个初始值,并对下一个值求反,然后与上一个和相加

+-------------+-------------+--------------+-----------------------------+
|  callback   | accumulator | currentValue |        return value         |
+-------------+-------------+--------------+-----------------------------+
| first call  |           0 |            0 | !0 + !0 = true + true = 2   |
| second call |           2 |            0 | !2 + !0 = false + true = 1  |
| third call  |           1 |            1 | !1 + !1 = false + false = 0 |
| fourth call |           0 |            1 | !0 + !1 = true + false = 1  |
+-------------+-------------+--------------+-----------------------------+
const arr=[0,0,0,1,1]

log(arr.reduce((a,b)=>a+!b,0))
reduce
中,每次我理解时,您都在对累积和(累加器)求反!,但是我怎样才能用reduce?Change
解决这个问题呢!a
a
并添加
0
initialValue
,这就像一个符咒。在那里完全犯了个错误。还要感谢@adiga。你能看看我的编辑吗?我选择了更现实的数据。我真的不明白为什么这不起作用-(@AndreElrico:
arr.reduce((a,b)=>a+!b.test,0);
,没有任何对数字***的属性测试会造成伤害…同样的错误。我想我现在明白了!先生,你是我的英雄。
arr = [{test: 0}, {test: 0}, {test: 0}, {test: 1}, {test: 1}]
arr.reduce((a, b) => a.test + !b.test, {test: 0});
// NaN

arr.reduce((a, b) => a.test + !b.test, 0);
//NaN
+-------------+-------------+--------------+-----------------------------+
|  callback   | accumulator | currentValue |        return value         |
+-------------+-------------+--------------+-----------------------------+
| first call  |           0 |            0 | !0 + !0 = true + true = 2   |
| second call |           2 |            0 | !2 + !0 = false + true = 1  |
| third call  |           1 |            1 | !1 + !1 = false + false = 0 |
| fourth call |           0 |            1 | !0 + !1 = true + false = 1  |
+-------------+-------------+--------------+-----------------------------+
arr.reduce((a, b) => a + !b, 0);