成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

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

開發 前端
為什么很多人會有這種疑惑,是因為犯了想當然的錯誤——望文生義。Math.min() 作為一個函數,返回的并不是最小值;同理 Math.max() 返回的也不是最大值。他們返回的是參數的最大值和最小值,而我們卻沒有傳遞任何參數。

[[171858]]

考慮如下代碼: 

  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>

 

責任編輯:龐桂玉 來源: segmentfault
相關推薦

2021-05-27 07:54:21

Math.max()-Infinity參數

2024-09-04 08:40:51

2009-12-11 17:45:09

PHP Math函數

2025-02-17 08:00:00

DeepSeek模型AI

2023-11-22 08:41:49

CSS前端

2010-09-10 13:56:25

SQLMAX()函數

2021-01-13 10:51:08

PromissetTimeout(函數

2022-11-10 15:32:29

2015-07-31 16:29:15

DockerJavaLinux

2019-04-24 08:00:00

HTTPSHTTP前端

2021-12-27 07:10:26

ClassmethodStaticmetho函數

2016-12-14 12:02:01

StormHadoop大數據

2017-02-14 14:20:02

StormHadoop

2009-06-17 11:58:19

Linux

2023-12-06 13:19:00

C++數學函數

2024-08-19 00:10:05

RocketMQ應用SDK

2020-03-18 14:08:48

Windows操作系統功能

2017-03-23 14:37:19

WebAssemblyasm.js編程

2020-10-27 12:06:17

MathJavaScript對象

2021-05-12 08:15:53

HTTPSHTTP安全
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久不射网 | 男人久久天堂 | 欧美国产视频一区二区 | 狠狠插狠狠操 | 国内91在线 | 亚洲一区二区三区四区五区午夜 | 亚洲午夜网 | 欧美一区二区 | 日韩在线中文字幕 | 日韩在线免费视频 | 一区二区三区视频在线 | 男女啪啪高潮无遮挡免费动态 | 日韩国产在线观看 | 国产精品久久久久久久久久 | 成人av在线播放 | 91精品国产91久久久久久最新 | 中文字幕一级 | 99精品网 | 色婷婷久久综合 | 免费黄色成人 | 日韩精彩视频 | 天天干天天草 | 久久久久久毛片免费观看 | 精品国产一区二区三区在线观看 | 欧美一区精品 | 国产精品一区二区久久久久 | 欧美精品二区三区 | 国产色婷婷精品综合在线手机播放 | 狠狠草视频 | 在线 丝袜 欧美 日韩 制服 | 午夜精品一区二区三区在线视 | 天天操天天操 | 亚洲一区二区三区四区五区午夜 | 国产精品国产自产拍高清 | 国产视频91在线 | 国产精品网址 | 99亚洲国产精品 | 午夜在线观看免费 | 91资源在线 | 精品国产欧美一区二区三区成人 | 天天操网|