为什么 Math.min() 比 Math.max() 大?

  发布时间:2025-11-05 09:08:16   作者:玩站小弟   我要评论
考虑如下代码:varmin=Math.min();varmax=Math.max();console.log(min<max); 按照常规思路,这段代码应该输出 true,毕竟最小 。

考虑如下代码: 

var min = Math.min();  var max = Math.max();  console.log(min < max); 

按照常规思路,这段代码应该输出 true,毕竟最小值应该小于***值。但是当我们运行这段代码时,却神奇的输出了 false。

为什么会这样呢?

还得去查查 MDN 的相关文档。

The Math.min() function returns the smallest of zero or more numbers.

Math.min 的参数是 0 个或者多个。如果是多个参数很容易理解,返回参数中最小的

如果是 0 个参数呢?文档中写到:

If no arguments are given, the result is Infinity.

If at least one of arguments cannot be converted to a number, theresult is NaN.

如果没有参数,则返回 Infinity。Infinity 是什么呢?Infinity 是 javascript 中全局对象的一个属性,在浏览器环境中就是window 对象的一个属性,表示无穷大。

而 Math.max() 没有传递参数时返回的是 -Infinity。因此 Math.min() 要比 Math.max() 大。

后续:

为什么很多人会有这种疑惑,是因为犯了想当然的源码库错误——望文生义。Math.min() 作为一个函数,返回的并不是最小值;同理 Math.max() 返回的也不是***值。他们返回的是参数的***值和最小值,而我们却没有传递任何参数。

javascript 中数值的***值和最小值常量分别是 Number.MAX_VALUE 和 Number.MIN_VALUE,在我电脑 V8 的运行结果是 1.7976931348623157e+308 和 5e-324。

这里也有一个坑,那就是 MIN_VALUE 并不是最小的数,而是绝对值最小的数,它是一个正数。而 Math.min() 的返回值比 Number.MAX_VALUE 还要大。

Math.min() 返回了 Infinity,这个值对应了 Number.POSITIVE_INFINITY 常量。Math.max() 返回了 -Infinity,服务器托管这个值对应了 Number.NEGATIVE_INFINITY 常量。

就像数学里面那样,正无穷和负无穷并不是确切的数,只是集合里面的概念。我们可以使用 0 减去正无穷来得到负无穷:0 - Infinity = -Infinity,或者通过 0 减去负无穷来得到正无穷:0 - (-Infinity) = Infinity。但是我们把正无穷和负无穷相加却得不到 0,事实上我们得到的是 NaN。

当我们真正明白了 Math.min 和 Math.max 只是返回了所有参数的***值,就很容易理解这个看似匪夷所思的结果了。

本来想查看 V8 的源码,但是搜索了一圈,也只找到了几个测试用例(文件: test/mjsunit/math-min-max.js): 

assertEquals(Infinity, Math.min());  assertEquals(1, Math.min(1));  assertEquals(1, Math.min(1, 2));  assertEquals(1, Math.min(2, 1));  assertEquals(1, Math.min(1, 2, 3));  assertEquals(1, Math.min(3, 2, 1));  assertEquals(1, Math.min(2, 3, 1)); 

从此测试用例中可以看出,Math.min() 确实返回了 Infinity。继续阅读此测试用例还会发现更有意思的事: 

assertEquals(-Infinity, Infinity / Math.min(-0, +0));  assertEquals(-Infinity, Infinity / Math.min(+0, -0));  assertEquals(-Infinity, Infinity / Math.min(+0, -0, 1)); 

对比下面的结果: 

assertEquals(Infinity, Infinity / Math.max(-0, +0));  assertEquals(Infinity, Infinity / Math.max(+0, -0));  assertEquals(Infinity, Infinity / Math.max(+0, -0, -1)); 

也就是说在 Math.min 和 Math.max 进行数值比较(javascript不分整型和浮点型)时,负零是小于正零的。高防服务器

-0、+0、-Infinity、+Infinity、NaN 这几个概念就可以讲上一天一夜了,篇幅有限就不展开讲了,以后有时间再填坑。

言归正传,现在我们换个思路,试着从算法的角度去考虑***值和最小值的问题。

我们如何求 N 个参数的***值呢?为了描述简单我们使用数组(感谢 @f2er前端百科) 

var max = ___; arr.forEach(function(n) {     if(n > max) {         max = n;     } }); 

如果是填空题,你会在空格处填什么呢?如此想来,这个返回值就很合理了。

--------------------------------

<del>本来以为是无参调用时返回了运算的幺元,后来细琢磨,好像没有什么关系,2333

对于运算集合 S 上的二元运算*,如果满足 a*x = x*a = x,则 a 是*运算的幺元。加法运算的幺元是 0,因为 0+x = x+0 = x。乘法运算的幺元是 1,因为 1*x = x*1 = x。但是我们定义函数 add() 或者 mult() 函数,如果不传递参数时,返回幺元的话也是不合理的。</del>

  • Tag:

相关文章

  • 电脑开机报0164错误解决办法(解决电脑开机报0164错误的简单方法)

    摘要:当我们打开电脑时,有时会遇到电脑屏幕上显示“0164键盘错误,请按F1继续”这样的错误信息。这个错误通常是由于键盘连接问题或键盘故障引起的。本文将介绍一些简单的方法来解决这个问题。...
    2025-11-05
  • 故障自愈出场后,运维就能歇歇了吧……

    一、背景最近晚上23:00甚至是凌晨总收到告警通知:磁盘可用量低于20%,这个时候不得不爬起来处理告警。当然这里要提醒大家:对于小问题,运维也绝不要抱着侥幸的心理,因为只有痛过才知道。磁盘类告警只是我
    2025-11-05
  • 聊聊智能诊断模型的构建

    ​谈到智能化运维,谈智能检测或者智能发现的比较多,谈智能诊断的比较少。智能诊断不好做,因为诊断涉及到复杂的分析与推理。检测与发现可以基于数据的统计学规律,通过训练与建模来不断提升性能,而复杂问题的诊断
    2025-11-05
  • 自动化在物联网部署中的作用

    自动化使企业能够更有效地创建新产品和服务,同时也有助于改进现有产品和流程。不仅如此,物联网自动化还可以帮助您避免物联网部署过程中的常见错误,并创建更加安全可靠的网络。随着组织急于实现其数字化转型目标,
    2025-11-05
  • 轻松学会以戴尔电脑分区桌面教程(简明易懂,快速操作)

    摘要:现如今,电脑已经成为我们日常生活中不可或缺的工具之一。然而,随着使用时间的增长,我们的电脑往往会变得越来越慢。这时,分区桌面就是一个非常有效的解决方案。本篇文章将为您介绍如何利用戴...
    2025-11-05
  • 面了一些运维,发现三个共同点

    最近因为一些原因,需要招一个运维人员,所以就筛选了很多简历,也面了很多人,我发现大家都有一些相同的问题。主要表现在以下几个方面:简历重点不明确会的多,但不精个人规划不清晰 下面从这三个方
    2025-11-05

最新评论