为何这些JavaScript求数组最大值的max函数无法正常工作?
为什么这些求数组最大值的JavaScript函数会失效?
我需要写一个JavaScript函数,要求返回数组中的最大值,空数组则返回undefined。但第一次尝试和拿到的参考解决方案都失效了,只有用for循环的写法能正常运行,下面逐个分析原因:
第一次尝试的失效代码
function getMax(array) { return array.reduce((max,current) => {if (current>max) max=current}) }
这个代码的核心问题是reduce的回调函数没有返回值:
- reduce的工作逻辑是,每一轮迭代都会把回调的返回值作为下一轮的累积值(也就是这里的
max) - 当
current > max时,代码只给max赋值,但没有return这个值;当current <= max时,回调函数完全没有返回内容,默认返回undefined - 迭代一轮后,下一次的
max就变成了undefined,最终整个reduce的结果就是undefined - 另外,这个函数没有处理空数组的情况,空数组调用
reduce会直接抛出错误
参考的失效代码
function getMax(array) { if (array.length === 0) return undefined; array.reduce((a, b) => (a > b) ? a : b); }
这个代码的回调函数是正常的(三元表达式会返回较大的那个值,累积值能正确更新),但函数本身没有return reduce的计算结果:
- reduce确实算出了数组的最大值,但函数最后没有把这个结果返回出去,所以调用这个函数时,默认返回
undefined
正常运行的for循环代码
function getMax(array) { let max=array[0]; for (let value of array) if (value>max) max=value; return max; }
这个写法逻辑直白清晰:
- 初始化
max为数组第一个元素,如果数组为空,array[0]就是undefined,最后返回undefined刚好符合要求 - 遍历数组每个值,只要当前值比
max大就更新max - 最后返回
max,整个流程没有遗漏,所以能正常运行
内容的提问来源于stack exchange,提问作者Silver
相关产品推荐
相关产品推荐

