一次遍历即可同时获取最大值和最小值,通过维护max和min两个变量,初始化为首个元素,后续逐个比较更新;需额外处理null、undefined、字符串等非数字及空数组情况。

一次遍历,同时拿到最大值和最小值
不需要写两个循环分别找最大和最小,用一个 for 循环就能搞定。关键是在遍历时维护两个变量:一个存当前找到的最大值,一个存当前找到的最小值。
初始化时,可以把第一个元素同时赋给 max 和 min;然后从第二个元素开始比较,每次更新对应变量即可。
- 遇到比 max 大的数,就更新 max
- 遇到比 min 小的数,就更新 min
- 遍历结束,max 和 min 就是最终结果
处理非数字或空数组的情况
真实数据常含 null、undefined、字符串甚至对象。直接比较可能得到 NaN 或错误结果(比如 "10" 是 true,因为字符串按字符逐位比 ASCII)。
建议在比较前做类型预处理:
- 用 Number() 或 parseFloat() 转换,再检查是否为有效数字(
!isNaN(num) && isFinite(num)) - 跳过非法项,不参与比较
- 空数组可提前返回
{ max: undefined, min: undefined },避免 Math.max([]) 返回 -Infinity 这类意外值
用 reduce 实现更函数式的写法
reduce 适合单次遍历并累积状态,代码清晰且不易漏逻辑分支:
- 初始值设为
{ max: -Infinity, min: Infinity },确保任何合法数字都能覆盖 - 回调里同时更新 max 和 min 字段,最后返回对象
- 比展开运算符
Math.max(...arr)更安全——不会因数组过大触发栈溢出,也便于加过滤逻辑
性能与兼容性小提醒
纯数值小数组,Math.max(...arr) 最简洁;但要注意浏览器兼容性(IE 不支持展开运算符)。
大数据量或需兼容老环境(如 IE8),手写 for 循环最快、最稳,内存占用低,也没有函数调用开销。
如果项目已用现代语法,reduce 是平衡可读性、健壮性和扩展性的优选。











