JavaScript中找数组最值常用Math.max(...arr)和Math.min(...arr),但需校验空数组及非数字项;reduce更灵活,适用于混合类型、对象数组或自定义比较。

JavaScript中找数组最大值和最小值,有多种写法,关键看数据类型、性能要求和是否需要兼容旧环境。
用 Math.max() 和 Math.min() 配合展开运算符(最常用)
适用于纯数字数组,简洁直观:
注意:不能直接传入数组,必须展开或用 apply
-
ES6+ 推荐写法:
Math.max(...arr)和Math.min(...arr) - 空数组会报错(NaN 或 -Infinity/Infinity 异常),使用前建议校验
- 如果数组含非数字项(如字符串、undefined),会被转为数字,可能得意外结果(例如
Math.max(...[1, '2', null])→2)
用 reduce() 逐个比较(灵活可控)
适合需要自定义比较逻辑、处理混合类型或避免展开大数组的场景:
立即学习“Java免费学习笔记(深入)”;
-
arr.reduce((max, cur) => cur > max ? cur : max)找最大值 arr.reduce((min, cur) => cur 找最小值- 可配合
Number()或parseFloat()做预处理,增强鲁棒性 - 初始值推荐设为
arr[0],避免对空数组调用时出错;也可先判断arr.length
用 for 循环(性能最优,兼容性最好)
在大数据量或需支持 IE8 等老环境时更稳妥:
- 手动遍历一次,维护临时变量
max和min - 比
reduce少创建函数闭包,比展开运算符不触发栈溢出风险(超大数组) - 可同步做类型过滤,例如跳过
NaN、null、非数字字符串
处理特殊情形的小技巧
实际项目中常遇到边界情况,提前考虑能少踩坑:
-
空数组:统一返回
undefined或抛错,不要依赖Math.max([])(返回-Infinity) -
含 NaN:
NaN > 5是false,但NaN === NaN为false,建议用isNaN()过滤 -
对象数组:按某字段取最值,可用
reduce比较cur.age > max.age,或先map提取再计算 -
字符串数组:默认按 Unicode 码点比较(
'10' 为 <code>true),需转数字再比


















