為什么 Math.min() 比 Math.max() 大耕魄?(續(xù))

昨天心血來潮寫了一篇文章:為什么Math.min() 比 Math.max() 大晨川?

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

javascript 中數(shù)值的最大值和最小值常量分別是 Number.MAX_VALUENumber.MIN_VALUE,在我電腦 V8 的運行結(jié)果是 1.7976931348623157e+3085e-324

這里也有一個坑渴逻,那就是 MIN_VALUE 并不是最小的數(shù)疾党,而是絕對值最小的數(shù),它是一個正數(shù)惨奕。而 Math.min() 的返回值比 Number.MAX_VALUE 還要大。

Math.min() 返回了 Infinity竭钝,這個值對應了 Number.POSITIVE_INFINITY 常量梨撞。Math.max() 返回了 -Infinity,這個值對應了 Number.NEGATIVE_INFINITY 常量香罐。

就像數(shù)學里面那樣卧波,正無窮和負無窮并不是確切的數(shù),只是集合里面的概念庇茫。我們可以使用 0 減去正無窮來得到負無窮:0 - Infinity = -Infinity港粱,或者通過 0 減去負無窮來得到正無窮:0 - (-Infinity) = Infinity。但是我們把正無窮和負無窮相加卻得不到 0旦签,事實上我們得到的是 NaN查坪。

當我們真正明白了 Math.min 和 Math.max 只是返回了所有參數(shù)的最大值,就很容易理解這個看似匪夷所思的結(jié)果了宁炫。

本來想查看 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望忆。繼續(xù)閱讀此測試用例還會發(fā)現(xiàn)更有意思的事:

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

對比下面的結(jié)果:

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

也就是說在 Math.minMath.max 進行數(shù)值比較(javascript不分整型和浮點型)時,負零是小于正零的竿秆。

-0启摄、+0、-Infinity幽钢、+Infinity歉备、NaN 這幾個概念就可以講上一天一夜了,篇幅有限就不展開講了搅吁,以后有時間再填坑威创。

言歸正傳,現(xiàn)在我們換個思路谎懦,試著從算法的角度去考慮最大值和最小值的問題肚豺。

我們?nèi)绾吻?N 個參數(shù)的最大值呢?為了描述簡單我們使用數(shù)組(感謝 @f2er前端百科)

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

如果是填空題界拦,你會在空格處填什么呢吸申?如此想來,這個返回值就很合理了。


<del>本來以為是無參調(diào)用時返回了運算的幺元截碴,后來細琢磨梳侨,好像沒有什么關(guān)系,2333

對于運算集合 S 上的二元運算日丹,如果滿足 ax = xa = x走哺,則 a 是運算的幺元。加法運算的幺元是 0哲虾,因為 0+x = x+0 = x丙躏。乘法運算的幺元是 1,因為 1x = x1 = x束凑。但是我們定義函數(shù) add() 或者 mult() 函數(shù)晒旅,如果不傳遞參數(shù)時,返回幺元的話也是不合理的汪诉。</del>

完废恋。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市扒寄,隨后出現(xiàn)的幾起案子鱼鼓,更是在濱河造成了極大的恐慌,老刑警劉巖旗们,帶你破解...
    沈念sama閱讀 221,695評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蚓哩,死亡現(xiàn)場離奇詭異,居然都是意外死亡上渴,警方通過查閱死者的電腦和手機岸梨,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來稠氮,“玉大人曹阔,你說我怎么就攤上這事「襞” “怎么了赃份?”我有些...
    開封第一講書人閱讀 168,130評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長奢米。 經(jīng)常有香客問我抓韩,道長,這世上最難降的妖魔是什么鬓长? 我笑而不...
    開封第一講書人閱讀 59,648評論 1 297
  • 正文 為了忘掉前任谒拴,我火速辦了婚禮,結(jié)果婚禮上涉波,老公的妹妹穿的比我還像新娘英上。我一直安慰自己炭序,他們只是感情好,可當我...
    茶點故事閱讀 68,655評論 6 397
  • 文/花漫 我一把揭開白布苍日。 她就那樣靜靜地躺著惭聂,像睡著了一般。 火紅的嫁衣襯著肌膚如雪相恃。 梳的紋絲不亂的頭發(fā)上辜纲,一...
    開封第一講書人閱讀 52,268評論 1 309
  • 那天,我揣著相機與錄音豆茫,去河邊找鬼侨歉。 笑死,一個胖子當著我的面吹牛揩魂,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播炮温,決...
    沈念sama閱讀 40,835評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼火脉,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了柒啤?” 一聲冷哼從身側(cè)響起倦挂,我...
    開封第一講書人閱讀 39,740評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎担巩,沒想到半個月后方援,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,286評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡涛癌,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,375評論 3 340
  • 正文 我和宋清朗相戀三年犯戏,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片拳话。...
    茶點故事閱讀 40,505評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡先匪,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出弃衍,到底是詐尸還是另有隱情呀非,我是刑警寧澤,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布镜盯,位于F島的核電站岸裙,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏速缆。R本人自食惡果不足惜降允,卻給世界環(huán)境...
    茶點故事閱讀 41,873評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望激涤。 院中可真熱鬧拟糕,春花似錦判呕、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,357評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至犁嗅,卻和暖如春边涕,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背褂微。 一陣腳步聲響...
    開封第一講書人閱讀 33,466評論 1 272
  • 我被黑心中介騙來泰國打工功蜓, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人宠蚂。 一個月前我還...
    沈念sama閱讀 48,921評論 3 376
  • 正文 我出身青樓式撼,卻偏偏與公主長得像,于是被迫代替她去往敵國和親求厕。 傳聞我的和親對象是個殘疾皇子著隆,可洞房花燭夜當晚...
    茶點故事閱讀 45,515評論 2 359

推薦閱讀更多精彩內(nèi)容