Math.max() 是一个内置的JavaScript实用函数,可以从参数中确定最大的数字。
例如,让我们确定1,2 和3 这几个数字的最大值:
Math.max(1, 2, 3); // => 3
正如预期的那样,3 是1 、2 和3 的最大值。
如果只用一个参数调用Math.max() ,会发生什么。
Math.max(1); // => 1
正如预期的那样,一个数字的最大值就是这个数字本身。
但是,如果你调用Math.max() ,完全没有参数,会发生什么?
Math.max(); // => -Infinity
虽然一开始可能会出乎意料,但调用Math.max() ,没有参数,会返回-Infinity 。让我们来看看为什么会发生,以及为什么会这样发生,这很重要。
1.一个数组的最大值
在深入探讨主要问题(为什么没有参数的Math.max() 会返回-Infinity )之前,让我们看看如何用Math.max() 来确定一个数组的最大数字。
Math.max(num1, num2, ..., numN) 接受多个数字参数并返回其中的最大数。简单得像个馅饼。
如果你想确定一个数组的最大数,那么你可以在数组上使用传播参数运算符。
const numbers1 = [1, 2, 3];
Math.max(...numbers1); // => 3
Math.max(...numbers1) 表达式使用传播语法,并返回numbers1 数组的最大数量:3 。
2.2个数组的最大数
现在让我们来尝试一些更有趣的东西。给定两个数组,让我们确定每个数组的最大数,然后确定这2个最大值的最大值。
这有点让人不知所措,但请容忍我...
const numbers1 = [1, 2, 3];
const numbers2 = [0, 6];
const max1 = Math.max(...numbers1);
const max2 = Math.max(...numbers2);
max1; // 3
max2; // 6
Math.max(max1, max2); // => 6
[1, 2, 3] 的最大数是3 ,而[0, 6] 的最大数是对应的6 。3 和6 的最大值是6 。
这是预期的。
如果有一个数组是空的,那么试图确定数组的最大值又如何呢?让我们把numbers1 作为一个空数组,再试一次:
const numbers1 = [];
const numbers2 = [0, 6];
const max1 = Math.max(...numbers1);
const max2 = Math.max(...numbers2);
max1; // -Infinity
max2; // 6
Math.max(max1, max2); // => 6
现在,在第一个数组为空的情况下,上面的代码片段正确地确定了6 是两个数组的最大值。
有趣的是返回Math.max(...numbers1) 的值:由于numbers1 数组是空的,这与调用Math.max() 不带参数是一样的。相应地,这就是-Infinity 。
然后Math.max(max1, max2) 被评估为Math.max(-Infinity, 6) ,结果是6 。
现在很清楚为什么在没有参数的情况下调用Math.max() ,会返回-Infinity :这是在空集上定义max函数的一种方式。
在max和加法之间建立一个平行关系,-Infinity 的max和0 的加法是一样的。
同样的行为发生在Math.min() ,当调用没有参数时,它返回Infinity 。
-Infinity就实数的最大运算而言,它被称为身份元素。
3.3.结论
Math.max() 在没有参数的情况下调用 ,以正确处理多个最大运算的情况(max of max of max...),特别是在确定一个空数组的最大值时非常有用。-Infinity
简单地说,如果你要确定2个数组的最大值,然后也确定这些最大值的最大值,你会得到预期的结果:
Math.max(
Math.max(...[]), // -Infinity
Math.max(...[0, 6]) // 6
); // => 6