javascript中“最大值”和“最小值”分两类:number.max_value/ min_value是数值表示边界,math.max()/min()是运行时极值计算函数,二者用途、行为及边界逻辑完全不同。

JavaScript 中的“最大值”和“最小值”其实指两类不同概念:一类是能表示的**数值范围极限**,另一类是用于**计算一组数中极值**的工具方法。两者名称相似但用途、行为和边界逻辑完全不同,容易混淆。
Number.MAX_VALUE 与 Number.MIN_VALUE:可表示的数值边界
这是 JavaScript 数值类型(IEEE 754 双精度浮点)定义的硬性范围:
-
Number.MAX_VALUE ≈ 1.7976931348623157e+308:JS 能安全表示的最大正有限数;超过它会变成
Infinity - Number.MIN_VALUE = 5e-324:JS 能表示的**最接近 0 的正数**(不是最小负数!),注意它不是最小可表示数的绝对值下限
- 真正的“最小负数”没有对称对应值;小于
-Number.MAX_VALUE会得到-Infinity - 这些值是静态属性,不可修改,也不参与数学运算推导(比如
Number.MIN_VALUE * 2仍是正常小数,不会“溢出为 0”)
Math.max() 与 Math.min():运行时求极值的函数
它们不关心数值边界,只对传入参数做转换和比较:
- 接受任意数量参数,例如
Math.max(3, -7, 12)返回12 - 参数会尝试转为数字:
Math.max(true, '5', null)→5(true→1,'5'→5,null→0) - 任一参数无法转为有效数字(如
undefined、{}、'abc'),结果直接为NaN - 不传参数时:
Math.max()返回-Infinity,Math.min()返回Infinity——这个设计让它们能自然融入reduce等聚合逻辑
数组求极值的常见写法与陷阱
因为 Math.max() 不接收数组,需展开处理:
-
ES6 扩展运算符(推荐):
Math.max(...[3, 8, 1])→8 -
apply 方法(旧写法):
Math.max.apply(null, [3, 8, 1]) -
避免 eval:如
eval('Math.max('+arr+')')存在安全与性能问题,已淘汰 -
空数组要兜底:
[].length === 0时,Math.max(...[])会报错(展开为空),应先判断或用默认值
Infinity 与 NaN 的角色定位
它们不是“值”,而是 JS 数值系统的特殊状态标记:
-
Infinity和-Infinity是合法数值,可参与比较(5 为 <code>true),但不能用于精确计算(如Infinity - Infinity得NaN) -
NaN永远不等于任何值(包括自身),判断必须用isNaN()或更严格的Number.isNaN() -
Number.MIN_VALUE是正数,0和负数都不等于它;真正“最小可表示负数”接近-Number.MAX_VALUE,但无标准常量名











