不能直接用 math.max(arr),因为 math.max() 接收多个独立参数而非数组;传入数组会被视为单个参数,其余为 undefined,结果返回 nan。

JavaScript 中可以用 Math.max.apply() 和 Math.min.apply() 来求数组中的最大值和最小值,核心是把数组“展开”成参数列表传给 Math.max 或 Math.min。
为什么不能直接用 Math.max(arr)?
Math.max() 接收的是多个独立参数(如 Math.max(1, 2, 3)),而不是一个数组。如果直接写 Math.max([1, 2, 3]),它会把整个数组当作第一个参数,其余为 undefined,结果返回 NaN。
用 apply 把数组转成参数列表
apply 方法允许你指定 this 值,并把一个数组(或类数组)作为参数列表传入函数。对 Math.max 来说,this 可以是任意值(因为它是静态方法),通常传 null 或 Math 都可以。
- 求最大值:
Math.max.apply(null, arr) - 求最小值:
Math.min.apply(null, arr)
例如:
console.log(Math.max.apply(null, arr)); // 9
console.log(Math.min.apply(null, arr)); // 1
注意空数组和非数字元素
如果数组为空,Math.max.apply(null, []) 会返回 -Infinity,Math.min.apply(null, []) 返回 Infinity,需手动处理边界情况。
如果数组含非数字(如字符串、undefined),会被尝试转为数字;转换失败则为 NaN,导致整个结果为 NaN。建议提前过滤或校验:
- 只保留有效数字:
arr.filter(x => typeof x === 'number' && !isNaN(x)) - 再用
apply计算
现代替代方案:扩展运算符(推荐)
ES6+ 更简洁的方式是用扩展运算符 ...:
Math.max(...arr)Math.min(...arr)
它语义更清晰,性能在大多数场景下也足够好。只有当数组极大(如超 10 万项)时,才可能遇到栈溢出风险,此时 apply 或循环遍历更稳妥。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











