2 回答

TA贡献1804条经验 获得超8个赞
它不“知道”,你在这里做:sum[val] = (sum[val] || 0) + 1;
sum
是第一次迭代中的空对象,然后它是从上一次迭代返回的对象(由于 是相同的return sum;
)。Andval
是当前值('y'
或'n'
)。
因此,在第一次迭代中,sum
will be{}
和val
will be 'y'
。然后这条线将设置sum['y'] = 1
,因为它本质上是这样的sum['y'] = (sum['y'] || 0) + 1
- 并且在那个点上,所以你会知道哪个是哪个。sum['y']
undefined
(undefined || 0) + 1
0 + 1
1
下一次发生同样的情况'n'
。
第三次,sum['y']
已经1
是以前的了,所以表达式变成(1 || 0) + 1
which is 1 + 1
which is 2
,所以你得到sum['y'] = 2
。
等等。
从调试器中查看此截屏视频:https ://recordit.co/FVkXjW1b5y

TA贡献1816条经验 获得超4个赞
.reduce()
有两个参数
回调函数
初始值(可选)
在您的情况下,空对象文字{}
是初始值。如果提供了初始值,它将作为第一个参数传递给回调函数。
的回调函数的第二个参数是调用的.reduce()
数组的当前元素.reduce()
。在第一次迭代中,val
是arr
数组中的第一个元素,即'y'
。
sum[val] = (sum[val] || 0) + 1;
在每次迭代中,上面的语句将添加值val
作为sum
对象中的键(初始值),其值是0 + 1
ifsum[val]
未定义或sum[val] + 1
ifsum[val]
已定义。
你的代码是如何执行的:
第一次调用 callback 时,sum
is{}
和val
is 'y'
。因为sum[val]
orsum['y']
是undefined
,'y'
被添加为 keysum
并且它的值为 1。当回调函数被第二次调用时同样的事情发生。2个电话后,sum
看起来像{ y: 1, n: 1 }
。
在第三次调用中,因为sum[val]
等于1
,所以之前添加的键y
被覆盖,sum[val] + 1
其计算结果为1 + 1
。所以在第三次通话后,sum
看起来像{ y: 2, n: 1 }
。在随后的回调函数调用中也会发生同样的事情。
添加回答
举报