您好,登錄后才能下訂單哦!
這篇文章給大家分享的是有關javascript中為什么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;
}
});
如果是填空題,你會在空格處填什么呢?如此想來,這個返回值就很合理了。
本來以為是無參調用時返回了運算的幺元,后來細琢磨,好像沒有什么關系,2333
對于運算集合 S 上的二元運算*,如果滿足 a*x = x*a = x,則 a 是*運算的幺元。加法運算的幺元是 0,因為 0+x = x+0 = x。乘法運算的幺元是 1,因為 1*x = x*1 = x。但是我們定義函數 add() 或者 mult() 函數,如果不傳遞參數時,返回幺元的話也是不合理的。
感謝各位的閱讀!關于“javascript中為什么Math.min()比Math.max()大”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。