在Array#中设置initialValue与Not设置initialValue

时间:2016-01-19 10:37:27

标签: javascript reduce

版本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中看到?

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

1 个答案:

答案 0 :(得分:4)

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