`Math.min()` 是 JavaScript 中的一个内置数学函数,用于返回传入参数中的**最小值**。
---
## ✅ 基本语法
```javascript
Math.min(value1, value2, ..., valueN)
```
- 接受任意数量的数字作为参数。
- 返回这些数字中最小的一个。
- 如果任意参数不能转换为数字,则返回 `NaN`。
---
### 🔹 示例 1:基本用法
```javascript
console.log(Math.min(10, 5, 20)); // 输出: 5
console.log(Math.min(-10, 0, 5)); // 输出: -10
console.log(Math.min(3.14, 2.71, 1.41)); // 输出: 1.41
```
---
### 🔹 示例 2:单个参数
```javascript
console.log(Math.min(42)); // 输出: 42
```
> ✅ 当只有一个参数时,直接返回该参数(前提是有效数值)。
---
### 🔹 示例 3:包含非数字 → 返回 NaN
```javascript
console.log(Math.min(10, 'abc', 20)); // 输出: NaN
console.log(Math.min(10, [], {})); // 输出: NaN
console.log(Math.min(10, '5')); // 输出: 5 (字符串 '5' 可以转成数字)
console.log(Math.min(10, 'hello')); // 输出: NaN
```
> ⚠️ 注意:JS 会尝试将参数隐式转换为数字。如果失败,结果就是 `NaN`。
---
### 🔹 示例 4:空参数列表
```javascript
console.log(Math.min()); // 输出: Infinity
```
> 📌 特别注意!**不传任何参数时,`Math.min()` 返回 `Infinity`**,这是一个容易出错的陷阱!
#### ❌ 常见错误场景:
```javascript
let arr = [];
let min = Math.min(...arr); // 展开空数组
console.log(min); // Infinity ← 不是你想要的结果
```
✅ 正确做法:检查数组是否为空
```javascript
const numbers = [/* 空 */];
const min = numbers.length > 0 ? Math.min(...numbers) : null;
console.log(min); // null 或抛异常,更安全
```
---
## ✅ 实际应用场景
### 🎯 场景 1:求数组中的最小值
由于 `Math.min()` 不接受数组,需要用 **展开运算符(spread)** 或 `apply`:
#### 方法一:使用展开运算符(推荐)
```javascript
const arr = [3, 1, 4, 1, 5, 9];
const min = Math.min(...arr);
console.log(min); // 输出: 1
```
> ⚠️ 注意:对于非常大的数组(如超过 ~100,000 项),展开运算符可能导致栈溢出。
#### 方法二:使用 `Function.prototype.apply`
```javascript
const arr = [3, 1, 4, 1, 5, 9];
const min = Math.min.apply(null, arr);
console.log(min); // 输出: 1
```
#### 方法三:使用 `Array.reduce()`(适用于超大数组)
```javascript
const arr = [3, 1, 4, 1, 5, 9];
const min = arr.reduce((a, b) => a < b ? a : b);
console.log(min); // 输出: 1
```
> ✅ 优势:不会因参数过多导致调用栈溢出。
---
## ✅ 小技巧:结合 Infinity 的行为做比较
```javascript
function findMin(arr) {
let min = Infinity;
for (let num of arr) {
if (num < min) min = num;
}
return min === Infinity ? undefined : min; // 处理空数组
}
```
这正是 `Math.min()` 内部逻辑的一种模拟方式。
---
## ✅ 总结
| 行为 | 结果 |
|------|------|
| `Math.min(10, 5, 8)` | `5` |
| `Math.min()` | `Infinity` |
| `Math.min(10, '5')` | `5`(类型转换) |
| `Math.min(10, 'x')` | `NaN` |
| `Math.min(...[])` | `Infinity` |
---
## ✅ 最佳实践建议
1. **永远不要对空数组使用 `Math.min(...arr)`**
```js
const min = arr.length ? Math.min(...arr) : null;
```
2. **大数组优先使用 `reduce` 避免栈溢出**
3. **需要处理 `null/undefined` 时先过滤**
```js
const validNumbers = arr.filter(n => typeof n === 'number' && !isNaN(n));
const min = validNumbers.length ? Math.min(...validNumbers) : null;
```
---