下划线 .reduce() returns NaN?

Underscore .reduce() returns NaN?

应将 1000 以下的所有 3 或 5 的倍数的自然数相加。

var sum = _.reduce( _.range(1, 1000), function(x, n) {
  if (n % 3 == 0 || n % 5 == 0) { return x+=n; }
}, 0);

我希望输出为 233168 但我得到 NaN.

出于某种原因 sum 不接受 0 的初始化值。但是,如果我在前面加上 var sum = 0; 那么它就可以工作,并且 returns 是 233168

的正确输出

为什么不接受初始化值?

问题是当条件失败时减少函数 returns undefined .. 因此 x 在随后的计算中未定义(最后一个 return 值)调用 .. 和未定义 + 数字是 .. 好吧,NaN。

此外,reduce使用不当;它应该有自己的状态。比较:

var sum = _.reduce( _.range(1, 1000), function(x, n) {
  // Add n to the tally if it is a valid multiple..
  // (the returned value is used as the *next* value of x)
  if (n % 3 == 0 || n % 5 == 0) { return x + n; }
  // ..or simply return the current tally.
  else { return x; }
}, 0);

请注意,sum 变量 不是 从归约函数内部分配的(无论如何它都会被外部分配覆盖)。这使 reduce 成为一个纯粹的操作,尽管偶尔会滥用可变备忘录,但更符合其 functional roots