日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
為什么Math.min()比Math.max()大?

考慮如下代碼:

創(chuàng)新互聯(lián)服務(wù)項目包括邕寧網(wǎng)站建設(shè)、邕寧網(wǎng)站制作、邕寧網(wǎng)頁制作以及邕寧網(wǎng)絡(luò)營銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢、行業(yè)經(jīng)驗、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,邕寧網(wǎng)站推廣取得了明顯的社會效益與經(jīng)濟效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到邕寧省份的部分城市,未來相信會繼續(xù)擴大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!

 
 
  1. var min = Math.min(); 
  2. var max = Math.max(); 
  3. console.log(min < max);

按照常規(guī)思路,這段代碼應(yīng)該輸出 true,畢竟最小值應(yīng)該小于***值。但是當(dāng)我們運行這段代碼時,卻神奇的輸出了 false。

為什么會這樣呢?

還得去查查 MDN 的相關(guān)文檔。

The Math.min() function returns the smallest of zero or more numbers.

Math.min 的參數(shù)是 0 個或者多個。如果是多個參數(shù)很容易理解,返回參數(shù)中最小的。

如果是 0 個參數(shù)呢?文檔中寫到:

If no arguments are given, the result is Infinity.

If at least one of arguments cannot be converted to a number, theresult is NaN.

如果沒有參數(shù),則返回 Infinity。Infinity 是什么呢?Infinity 是 javascript 中全局對象的一個屬性,在瀏覽器環(huán)境中就是window 對象的一個屬性,表示無窮大。

而 Math.max() 沒有傳遞參數(shù)時返回的是 -Infinity。因此 Math.min() 要比 Math.max() 大。

后續(xù):

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

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

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

Math.min() 返回了 Infinity,這個值對應(yīng)了 Number.POSITIVE_INFINITY 常量。Math.max() 返回了 -Infinity,這個值對應(yīng)了 Number.NEGATIVE_INFINITY 常量。

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

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

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

 
 
  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));

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

 
 
  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 進行數(shù)值比較(javascript不分整型和浮點型)時,負零是小于正零的。

-0、+0、-Infinity、+Infinity、NaN 這幾個概念就可以講上一天一夜了,篇幅有限就不展開講了,以后有時間再填坑。

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

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

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

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

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

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

對于運算集合 S 上的二元運算*,如果滿足 a*x = x*a = x,則 a 是*運算的幺元。加法運算的幺元是 0,因為 0+x = x+0 = x。乘法運算的幺元是 1,因為 1*x = x*1 = x。但是我們定義函數(shù) add() 或者 mult() 函數(shù),如果不傳遞參數(shù)時,返回幺元的話也是不合理的。


文章題目:為什么Math.min()比Math.max()大?
標(biāo)題來源:http://m.5511xx.com/article/djpgjsh.html