问题描述
我有意将 return sum
注释掉了,因为它没有按预期工作。
如果我删除返回总和,它会返回正确的平均值。但这是我不明白的:当它在最后一个索引位置进入 if 时,此返回显示 NaN。
但是为什么它返回 NaN?
const mediaNumeros = numeros.reduce((sum,element,index,array) => {
sum = sum + element;
if (index == array.length - 1) {
return Number((sum / array.length).toFixed(2));
}
// return sum;
},0)
解决方法
假设 numeros 的值为 [8,90,7]
让我们看看每次迭代发生了什么:-
第一次迭代:
在计算 sum
- 数组:[8,7]
- 元素:8
- 索引:0
- 总和:0
计算sum
后
- 数组:[8,7]
- 元素:8
- 索引:0
- 总和:8
如果我们在第一次迭代后不返回 sum
:
在第二次迭代中:
在计算 sum
- 总和:
undefined
- 数组:[8,7]
- 元素:90
- 索引:1
注意:Array.prototype.reduce() 接受一个函数(即高阶函数)而不是循环。
sum
变得未定义,因为我们没有返回前一个函数调用的值。 js 引擎不知道 sum
的值是多少,因为前面的函数已经完成并且它的执行上下文被删除了。
计算后sum
- 总和:
undefined
+ 90 =NaN
- 数组:[8,7]
- 元素:90
- 索引:1
所以 sum
的值变成 NaN
因此它继续将 sum
的值计算为 NaN。