摘要:本來以為是無參調(diào)用時(shí)返回了運(yùn)算的幺元,后來細(xì)琢磨,好像沒有什么關(guān)系,對(duì)于運(yùn)算集合上的二元運(yùn)算,如果滿足,則是運(yùn)算的幺元。乘法運(yùn)算的幺元是,因?yàn)?。但是我們定義函數(shù)或者函數(shù),如果不傳遞參數(shù)時(shí),返回幺元的話也是不合理的。
昨天心血來潮寫了一篇文章:為什么Math.min() 比 Math.max() 大?
為什么很多人會(huì)有這種疑惑,是因?yàn)榉噶讼氘?dāng)然的錯(cuò)誤——望文生義。Math.min() 作為一個(gè)函數(shù),返回的并不是最小值;同理 Math.max() 返回的也不是最大值。他們返回的是參數(shù)的最大值和最小值,而我們卻沒有傳遞任何參數(shù)。
javascript 中數(shù)值的最大值和最小值常量分別是 Number.MAX_VALUE 和 Number.MIN_VALUE,在我電腦 V8 的運(yùn)行結(jié)果是 1.7976931348623157e+308 和 5e-324。
這里也有一個(gè)坑,那就是 MIN_VALUE 并不是最小的數(shù),而是絕對(duì)值最小的數(shù),它是一個(gè)正數(shù)。而 Math.min() 的返回值比 Number.MAX_VALUE 還要大。
Math.min() 返回了 Infinity,這個(gè)值對(duì)應(yīng)了 Number.POSITIVE_INFINITY 常量。Math.max() 返回了 -Infinity,這個(gè)值對(duì)應(yīng)了 Number.NEGATIVE_INFINITY 常量。
就像數(shù)學(xué)里面那樣,正無窮和負(fù)無窮并不是確切的數(shù),只是集合里面的概念。我們可以使用 0 減去正無窮來得到負(fù)無窮:0 - Infinity = -Infinity,或者通過 0 減去負(fù)無窮來得到正無窮:0 - (-Infinity) = Infinity。但是我們把正無窮和負(fù)無窮相加卻得不到 0,事實(shí)上我們得到的是 NaN。
當(dāng)我們真正明白了 Math.min 和 Math.max 只是返回了所有參數(shù)的最大值,就很容易理解這個(gè)看似匪夷所思的結(jié)果了。
本來想查看 V8 的源碼,但是搜索了一圈,也只找到了幾個(gè)測(cè)試用例(文件: 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));
從此測(cè)試用例中可以看出,Math.min() 確實(shí)返回了 Infinity。繼續(xù)閱讀此測(cè)試用例還會(huì)發(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));
對(duì)比下面的結(jié)果:
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 進(jìn)行數(shù)值比較(javascript不分整型和浮點(diǎn)型)時(shí),負(fù)零是小于正零的。
-0、+0、-Infinity、+Infinity、NaN 這幾個(gè)概念就可以講上一天一夜了,篇幅有限就不展開講了,以后有時(shí)間再填坑。
言歸正傳,現(xiàn)在我們換個(gè)思路,試著從算法的角度去考慮最大值和最小值的問題。
我們?nèi)绾吻?N 個(gè)參數(shù)的最大值呢?為了描述簡(jiǎn)單我們使用數(shù)組(感謝 @f2er前端百科)
var max = ___; arr.forEach(function(n) { if(n > max) { max = n; } });
如果是填空題,你會(huì)在空格處填什么呢?如此想來,這個(gè)返回值就很合理了。
本來以為是無參調(diào)用時(shí)返回了運(yùn)算的幺元,后來細(xì)琢磨,好像沒有什么關(guān)系,2333
對(duì)于運(yùn)算集合 S 上的二元運(yùn)算,如果滿足 ax = xa = x,則 a 是運(yùn)算的幺元。加法運(yùn)算的幺元是 0,因?yàn)?0+x = x+0 = x。乘法運(yùn)算的幺元是 1,因?yàn)?1x = x1 = x。但是我們定義函數(shù) add() 或者 mult() 函數(shù),如果不傳遞參數(shù)時(shí),返回幺元的話也是不合理的。
完。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/80390.html
摘要:考慮如下代碼按照常規(guī)思路,這段代碼應(yīng)該輸出,畢竟最小值應(yīng)該小于最大值。為什么會(huì)這樣呢還得去查查的相關(guān)文檔。是什么呢是中全局對(duì)象的一個(gè)屬性,在瀏覽器環(huán)境中就是對(duì)象的一個(gè)屬性,表示無窮大。繼續(xù)閱讀為什么比大續(xù) 考慮如下代碼: var min = Math.min(); var max = Math.max(); console.log(min < max); 按照常規(guī)思路,這段代碼應(yīng)該輸出...
摘要:這個(gè)的長(zhǎng)度是最小可能的最大差值。注意考慮和兩個(gè)邊界值也要加進(jìn)去。 題目:Given an unsorted array, find the maximum difference between the successive elements in its sorted form. Try to solve it in linear time/space. Return 0 if the...
摘要:本文的思想源自于在上的演講。我收集這些例子的主要目的是將它們整理并清楚理解它們的原理。著主要是因?yàn)榇罄ㄌ?hào)也是函數(shù)定義語法的一部分。自從年雙十一正式上線,累計(jì)處理了億錯(cuò)誤事件,得到了金山軟件等眾多知名用戶的認(rèn)可。 譯者按: JavaScript有很多坑,經(jīng)常一不小心就要寫bug。 原文: What the f*ck JavaScript? 譯者: Fundebug 為了保證可讀性...
摘要:說明你可以假設(shè)數(shù)組中所有元素都是非負(fù)整數(shù),且數(shù)值在位有符號(hào)整數(shù)范圍內(nèi)。提示按奇偶排序數(shù)組給定一個(gè)非負(fù)整數(shù)數(shù)組,中一半整數(shù)是奇數(shù),一半整數(shù)是偶數(shù)。對(duì)數(shù)組進(jìn)行排序,以便當(dāng)為奇數(shù)時(shí),也是奇數(shù)當(dāng)為偶數(shù)時(shí),也是偶數(shù)。 原博客地址:https://finget.github.io/2019... 排序 showImg(https://segmentfault.com/img/remote/146...
摘要:然而,不會(huì)在年的基礎(chǔ)上加,而只是表示年。閉包這是一個(gè)經(jīng)典的面試題雖然期望輸出,然而實(shí)際上卻不會(huì)。因?yàn)榈谛械臎]有在正確的環(huán)境下執(zhí)行。 譯者按: 漫漫編程路,總有一些坑讓你淚流滿面。 原文: Who said javascript was easy ? 譯者: Fundebug 為了保證可讀性,本文采用意譯而非直譯。另外,本文版權(quán)歸原作者所有,翻譯僅用于學(xué)習(xí)。 這里我們針對(duì)JavaScri...
閱讀 2646·2021-10-14 09:47
閱讀 4939·2021-09-22 15:52
閱讀 3361·2019-08-30 15:53
閱讀 1458·2019-08-30 15:44
閱讀 689·2019-08-29 16:41
閱讀 1658·2019-08-29 16:28
閱讀 448·2019-08-29 15:23
閱讀 1628·2019-08-26 12:20