Javascript 下划线.reduce()返回NaN?
应将1000以下的所有自然数(3或5的倍数)相加Javascript 下划线.reduce()返回NaN?,javascript,underscore.js,Javascript,Underscore.js,应将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然后它工作并返回正确的输出233168 为什么它不接受初始化的值?问题是当条件失败时,缩减函数返回未定义
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
然后它工作并返回正确的输出233168
为什么它不接受初始化的值?问题是当条件失败时,缩减函数返回未定义的值。。因此,
x
在随后的调用中计算为未定义(最后的返回值)。。未定义+一个数字是。。嗯,楠
而且,正在被错误地使用;它应该有自己的状态。将其与:
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
变量不是从reduced函数内部赋值的(它无论如何都会被外部赋值覆盖)。这使得reduce
成为一个纯粹的操作,尽管有时会滥用可变的备忘,但更真实。问题是当条件失败时,reduce函数返回未定义的
。。因此,x
在随后的调用中计算为未定义(最后的返回值)。。未定义+一个数字是。。嗯,楠
而且,正在被错误地使用;它应该有自己的状态。将其与:
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
变量不是从reduced函数内部赋值的(它无论如何都会被外部赋值覆盖)。这使reduce
成为一种纯粹的操作,尽管有时会滥用可变备忘录,但更真实。如果数字不是3或5的倍数,您将返回什么?仅供参考,您可以在顺序范围内对倍数求和,而无需循环。这只能用数学来完成。如果数字不是3或5的倍数,你会返回什么?仅供参考,你可以在不循环的情况下按顺序对倍数求和。这只能通过数学来完成。