版本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但数组为空,则将返回单独值而不调用回调。