apply方法可将数组展开为参数调用math.max/min等不支持数组的函数,因二者仅接受独立数值参数;直接传数组会返回nan;首个参数常设null,空数组时需额外判断避免-infinity/+infinity。

apply 方法是 JavaScript 中调用函数并显式指定 this 值和参数数组(类数组)的常用方式。它特别适合把一组动态长度的数值传给 Math.max 或 Math.min 这类只接受逗号分隔参数、不支持数组直接传入的函数。
为什么不能直接用 Math.max(arr)?
Math.max() 和 Math.min() 不接收数组,而是要求每个数值作为独立参数。比如:Math.max(1, 5, 3) ✅Math.max([1, 5, 3]) ❌ → 返回 NaN,因为数组被当作单个参数,而 Math.max 无法解析数组为数字。
用 apply 把数组“展开”成参数列表
apply 的第二个参数接受一个数组(或类数组),会将其中每一项依次作为函数的参数传入:
-
Math.max.apply(null, [1, 5, 3])等价于Math.max(1, 5, 3),返回5 -
Math.min.apply(null, [1, 5, 3])返回1 - 第一个参数设为
null是因为Math.max/min是静态方法,不依赖this;也可写Math.max.apply(Math, arr)
兼容空数组或无效输入的安全写法
如果传入空数组 [],Math.max.apply(null, []) 会返回 -Infinity,Math.min 返回 +Infinity,这通常不符合预期。建议加一层判断:
-
// 安全获取最大值
function safeMax(arr) {<br> return arr.length === 0 ? NaN : Math.max.apply(null, arr);<br> } -
// 或使用扩展运算符(ES6+ 更推荐,但题目问 apply)
Math.max(...arr)功能等价,且更简洁;不过apply在旧环境(如 IE8)仍有必要
实际例子:处理用户输入的多个数字
假设你从表单拿到一组字符串数字:['12', '7', '99', '3'],需先转为数字再求极值:
const nums = ['12', '7', '99', '3'].map(Number);const max = Math.max.apply(null, nums); // 99const min = Math.min.apply(null, nums); // 3
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











