math.max([1,2,3]) 返回 nan,因为 math.max 接收的是单个数组参数而非多个数值,数组转字符串再转数字得 nan;应使用 math.max(...arr) 或 math.max.apply(null, arr) 展开数组。

直接用 Math.max() 无法处理数组,因为它只接受多个独立参数,不接受数组。但通过 call(或 apply)可以显式绑定 this 并传入参数列表,从而把数组“展开”为参数。
为什么 Math.max([1,2,3]) 返回 NaN?
Math.max() 的设计是接收零个或多个数值参数,比如 Math.max(1, 2, 3)。当你传入一个数组如 [1,2,3],它实际收到的是**一个参数(数组对象)**,而数组不是数字,所以被转为 "1,2,3" 字符串,再转数字就是 NaN。
用 call 借用并传参:Math.max.call(null, ...arr)
call 的第一个参数是 this 值,对 Math.max 来说无关紧要(它是纯函数),填 null 或 undefined 即可;后续参数是逐个列出的实参。因此需先把数组“打散”成独立参数:
- ES6+ 推荐写法:
Math.max(...arr)(扩展运算符,最简洁) - 兼容老环境(如 IE)才用
call:Math.max.call(null, arr[0], arr[1], ...) - 但手动列元素不现实 → 实际用
Math.max.apply(null, arr)更合适(apply接收数组作为参数列表) - 若坚持用
call,需配合spread或concat模拟,例如:Math.max.call(null, ...arr)—— 这本质已是扩展运算符,不是传统call的典型用法
安全获取数组最大值(防空数组)
空数组调用 Math.max(...[]) 或 Math.max.apply(null, []) 都返回 -Infinity,通常不符合预期。建议加判断:
arr.length === 0 ? undefined : Math.max(...arr)- 或用
reduce:arr.reduce((a, b) => a > b ? a : b)(空数组会报错,需初始值) - 稳妥写法:
arr.length ? Math.max(...arr) : null
真正“显式绑定 + 借用”的经典场景是 apply,比如 Math.max.apply(null, [1,2,3])。虽然 call 理论上也能做,但必须配合扩展运算符才实用,此时已不如直接用扩展符自然。核心在于理解:函数借用的关键是让参数形式匹配,而不是拘泥于用 call 还是 apply。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











