函数介绍
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Math/max
堆栈溢出
当数组元素过多时, 使用Math.max()/min()会溢出, 导致结果不准确: 控制台打印报错显示: RangeError: Maximum call stack size exceeded
。
关于该问题, MDN中也有相关说明:
如果数组有太多的元素, 展开语法(…)和 apply 都将失败或返回错误的结果, 因为它们试图将数组元素作为函数形参传递。reduce 解决方案不存在这个问题。 —— MDN Math.max()
最值解决方案
1. reduce
使用reduce求最值, 可以避免溢出问题
const arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
const max = arr.reduce((a, b) => Math.max(a, b), -Infinity);
const min = arr.reduce((a, b) => Math.min(a, b), Infinity);
console.log(max, min);
// 当前也可以不使用Math函数
arr.reduce((max, value) => (value > max ? value : max), array[0]);
2. for
使用for循环遍历数组寻找最值, 可以避免溢出问题
const arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
let max = -Infinity;
let min = Infinity;
for (let i = 0; i < arr.length; i++) {
if (arr[i] > max) {
max = arr[i];
}
if (arr[i] < min) {
min = arr[i];
}
}
console.log(max, min);
3. lodash
lodash库提供了寻找最值的函数, 可以避免溢出问题
import _ from 'lodash';
const arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
const max = _.max(arr);
const min = _.min(arr);
console.log(max, min);