math.min()和math.max()不接受数组参数,必须用扩展运算符...展开数组;解构赋值非必需且易误用,安全写法需校验空数组、预处理类型,并注意超大数组性能问题。

直接用 Math.min(...arr) 和 Math.max(...arr) 就能拿到最值,解构语法在这里只是展开数组的手段,不是必需环节;强行套解构反而容易出错。
为什么不能写成 Math.min([1, 2, 3])
Math.min 和 Math.max 不接受数组参数,只接受多个独立数值。传入数组会返回 NaN,因为内部把整个数组当作一个参数去比较,而数组转数字是 NaN:
Math.min([1, 2, 3]) // NaN
所以必须把数组“摊开”——也就是用扩展运算符 ...,而非解构赋值(const [a, b, c] = arr)。
解构语法在这里常被误用的场景
有人试图这样写:
const [min, max] = [Math.min(...arr), Math.max(...arr)];
这看起来像“解构”,但实际只是数组字面量的解构赋值,和原数组 arr 的结构无关。真正起作用的仍是 ...,不是解构本身。常见误解包括:
- 以为
const [min, ...rest] = arr能直接拿到最小值(不能,这只是取首项) - 试图用解构 + 剩余参数模拟排序或筛选(性能差且逻辑错乱)
- 对空数组不加保护,
Math.min(...[])返回Infinity,Math.max(...[])返回-Infinity
安全获取最值的推荐写法
兼顾可读性、健壮性和执行效率:
- 非空校验必须做:空数组或
null/undefined输入要提前拦截 - 避免重复展开:如果同时要 min 和 max,别写两遍
...arr,浏览器虽会优化,但语义上建议复用 - 类型预处理:确保数组元素可转为数字,否则
Math.min('1', '2', '10')返回1(字符串比较),而Math.min(...[1, 2, 10])才是正确数值比较
示例:
const arr = [3, 1, 4, 1, 5];<br>if (arr.length === 0) throw new Error('Empty array');<br>const numbers = arr.map(Number);<br>const min = Math.min(...numbers);<br>const max = Math.max(...numbers);
真正容易被忽略的是:扩展运算符对超大数组(比如 >10⁵ 元素)可能触发栈溢出或性能陡降,这时得换用循环遍历——Math.min/max 配合展开,本质是便捷写法,不是万能解法。










