版本1:

var c = [ '##' ]

console.log(c.reduce(function(a,b){
 return  b.length
}, 0)) // 2


版本2:

var c = [ '##' ]

console.log(c.reduce(function(a,b){
 return  b.length
})) // "##"


我只是好奇为什么如果我没有提供版本2中的初始值,那么length方法不起作用?

那么有人可以在这种情况下告诉我,为什么我需要提供长度方法的初始值才能起作用?

最佳答案

版本1

来自MDN Docs for Array#reduce


  首次调用该回调时,previousValue和currentValue可以是两个值之一。如果在reduce的调用中提供了initialValue,则previousValue将等于initialValue,而currentValue将等于数组中的第一个值。


在版本#1中,提供了initialValue。因此,根据文档,previousValue被分配为initialValue

因此,对于第一次迭代:

previousValue = initialValue
previousValue = 0


并且nextValue是数组中的第一个元素。

nextValue = '##'


因此,返回值2。



版本2不言自明


  如果数组为空并且未提供initialValue,则将引发TypeError。如果数组只有一个元素(与位置无关)且未提供initialValue,或者如果提供了initialValue但数组为空,则将返回单独值而不调用回调。

07-28 06:17