Math.min不接受数组,直接传入返回NaN;需用解构语法(...)或apply展开,但空数组或含非数字项会出错,大数组需改用reduce避免栈溢出。

Math.min 本身不接受数组,直接传数组会返回 NaN。必须配合解构语法(...)或 apply 才能“展开”数组元素为独立参数——这是最常踩的坑。
为什么 Math.min([1, 2, 3]) 返回 NaN
Math.min 设计就是接收多个数值参数,比如 Math.min(1, 2, 3)。传入一个数组时,它把整个数组当作第一个参数,其余无参数,等价于 Math.min([1,2,3]) → 类型错误(数组不能参与数值比较),结果强制转为 NaN。
解构语法是首选,但要注意空数组和非数字项
用 Math.min(...arr) 最简洁,但有两个硬性前提:
- 数组不能为空,否则
Math.min(...[])报错:Math.min() expects at least 1 argument, but got 0 - 所有元素必须可转为有效数字,
Math.min(...[1, '2', null])会得到0(null→0),而Math.min(...[1, '2', undefined])得到NaN(undefined→NaN) - 业务指标若含字符串单位(如
"12.5ms"或"98%"),需先清洗:用parseFloat提取数字,过滤掉NaN结果
动态数组场景下推荐的安全写法
假设你拿到的是后端返回的指标数组 response.metrics,可能为空、含脏数据、或结构嵌套:
const metrics = response.metrics?.map(item => parseFloat(item.value))?.filter(n => !isNaN(n)); const min = metrics?.length ? Math.min(...metrics) : null;
关键点:
- 链式调用防
undefined报错 - 用
parseFloat而非Number,前者对"12.5ms"返回12.5,后者返回NaN - 显式过滤
NaN,避免污染Math.min - 空数组时返回
null(或Infinity,取决于业务语义),不抛异常
大数组时解构会栈溢出,得换方案
当指标数组超过几万项(比如埋点聚合结果),Math.min(...hugeArr) 可能触发 RangeError: Maximum call stack size exceeded。此时必须退回到循环或 reduce:
reduce










