考虑如下代码:

  1. var min = Math.min();
  2. var max = Math.max();
  3. 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):

  1. assertEquals(Infinity, Math.min());
  2. assertEquals(1, Math.min(1));
  3. assertEquals(1, Math.min(1, 2));
  4. assertEquals(1, Math.min(2, 1));
  5. assertEquals(1, Math.min(1, 2, 3));
  6. assertEquals(1, Math.min(3, 2, 1));
  7. assertEquals(1, Math.min(2, 3, 1));

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

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

对比下面的结果:

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

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

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

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

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

  1. var max = ___;
  2. arr.forEach(function(n) {
  3. if(n > max) {
  4. max = n;
  5. }
  6. });

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

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

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

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

作者:justjavac

来源:51CTO

为什么 Math.min() 比 Math.max() 大?相关推荐

  1. Math.min()和Math.max()的使用

    Math.min()返回零个或更多个数值的最小值 1.返回给定数值中最小的数.如果任一参数不能转换为数值,则返回NaN.如果没有参数,结果为Infinity(无穷大). 参数有效值:整数,浮点数,数字 ...

  2. 深入学习java源码之Math.max()与 Math.min()

    深入学习java源码之Math.max()与 Math.min() java基本数据类型及自动转型 8种基本数据类型及其所占空间大小: 一.byte,占用一个字节,取值范围为 -128-127,默认是 ...

  3. 使用Math.max和Math.min求数组的最大值和最小值

    正常情况下,如果我们求数组的值,用到的就是for循环,如果在代码中经常求最大值和最小值的话,会显得代码很乱.所以,就考虑一中最简单的方法求最大值. 使用Math里面自带的max和min方法 funct ...

  4. 使用Math.max和Math.min方法实现三个数中取中位数

    public int midNum(int a,int b,int c){int mid = Math.max(a,b) > c ? Math.max(Math.min(a,b),c) : Ma ...

  5. System.Math.Min(System.Threading.Interlocked.Increment(i), i - 1)

    System.Math.Min(System.Threading.Interlocked.Increment(i), i - 1) 在vb里面  等价于i=i-1 在C#里面 等价于i-- 是有C#自 ...

  6. math.pow int_Java Math类static int min(int i1,int i2)与示例

    math.pow int 数学类静态int min(int i1,int i2) (Math Class static int min(int i1 , int i2) ) This method i ...

  7. math 计算float_Java Math类静态float min(float f1,float f2)与示例

    math 计算float 数学类静态浮点数min(float f1,float f2) (Math Class static float min(float f1 , float f2) ) This ...

  8. java math max_Java Math类静态double max(double d1,double d2)示例

    java math max 数学类静态double max(double d1,double d2) (Math Class static double max(double d1,double d2 ...

  9. 数据结构:删除顺序表中小于min和大于max的数(不需要从大到小排列依然可以)

    1.题目要求: 设计一个算法,删除递增有序链表中值小于min和大于max的所有元素 2.题目分析 依次找到对应元素,而后进行删除. int listDelete(SqList& L, int ...

  10. math.hypot java_Java math

    Java math 函数 JavaMath类提供了几种用于数学计算的方法,例如min(),max(),avg(),sin(),cos(),tan(),round(),ceil(),floor(),ab ...

最新文章

  1. 算法试题 - 找出最小 k 个数
  2. 深度学习的数学 (6)误差反向传播法必需的链式法则
  3. 记录一个海思TOE的BUG
  4. linux进程源码分析,Linux内核源代码分析——口述程序猿如何意淫进程(一)
  5. 第三次学JAVA再学不好就吃翔(part24)--构造方法
  6. C++:08---成员变量初始化方式
  7. 怎么将tflite部署在安卓上_tensorflow从训练自定义CNN网络模型到Android端部署tflite...
  8. pppoe路由桥混合模式启用_无线路由器怎么设置
  9. c++语言编程,一个电灯两个开关控制,[理学]四川大学计算机学院精品课程_面向对象程序设计C++课件_游洪越_第一章绪论.ppt...
  10. asp.net mvc 发布问题
  11. atitit 编程语言选型知识点体系.docx 编程语言选型时,你需要考虑的几个方面 目录 1. 1.2. 类型系统 5 1 2. 1.5. 语言规范 25 1 3. 1.6. 编程范式 52
  12. 芯片架构--四大处理器架构
  13. springboot教务评教系统毕业设计源码252116
  14. SEO中的关键词密度该如何布局
  15. oa工作任务管理系统设计
  16. django踩坑记录
  17. 云数智驱动数据高速增长,浪潮存储提供EB级容量扩展
  18. 下载分享永不关机 几步玩转家庭NAS组建
  19. 一个小问题,解决提示无法启动程序,“....exe”。系统找不到指定文件
  20. ElementUI表格吸顶(sticky)

热门文章

  1. Atitit 使用js nodejs进行图像处理ocr的解决方案attilax总结
  2. paip. mysql如何临时 暂时 禁用 关闭 触发器
  3. paip.asp vbs通过CLI命令行调用PHP代码
  4. python : 读取csv最快的Datatable的用法
  5. Julia: 趣!,13579分别在一本168页书的页码中出现的次数
  6. Julia:副本copy引发的问题,期待0.4.0版本!
  7. 十种程序语言帮你读懂大数据的“秘密”,Julia位列其中!(转)
  8. 掌门教育微服务体系 Solar
  9. OpenInfra中国日志愿者第三次会议召开
  10. 【图像去噪】基于matlab GUI DCT图像去噪【含Matlab源码 614期】