2015-11-16 56 views
-2
function getDaysInMonth(y, m) { 
    return /8|3|5|10/.test(--m)?30:m==1?(!(y%4)&&y%100)||!(y%400)?29:28:31; 
} 
getDaysInMonth(2012, 1); 

你好傢伙!請幫我理解這段代碼對我來說更具可讀性,我剛開始學習js。這個JS函數是如何工作的

+1

您是否在尋找關於該功能如何工作的解釋,或者您是否在尋找一種不太複雜的解決方案? –

+0

@AustinBrunkhorst編寫一個更具可讀性的函數,謝謝 – vc2designer

+0

我想編輯這個問題,但它傷害了我的腦海。他想要加密嗎?或者瞭解它做了什麼?當問題如此時,程序是什麼?可疑的。 – Spaceman

回答

3

condition ? result1 : result2三元運算符是一樣的爲:

if (condition) 
    result1 
else 
    result2 

所以,如果你展開它,那麼你會得到下面的代碼:

function getDaysInMonth(y, m) 
{ 
    m = m - 1; // For some reasons, the author decided to use 0-based month 
    if (/8|3|5|10/.test(m)) // April, June, September, November 
     return 30; 

    if (m == 1) // February 
    { 
     if ((!(y % 4) && y % 100) || !(y % 400)) // Leap year check 
      return 29; 
     else 
      return 28; 
    } 

    return 31; // Other monthes 
} 

唯一令人困惑的事情是

/8|3|5|10/.test(m) 

這是一樣的下面,但是使用正則表達式:

if (m == 8 || m == 3 || m == 5 || m == 10) 

使用正則表達式時,可以不使用它被認爲是不好的做法。這絕對不是計算這個我見過的最好的函數。

有是由用戶Jaromanda X.建議
另一個簡單的方法是有一個數組有道:

function getDaysInMonth(y, m) 
{ 
    if (m == 2) // February 
    { 
     if ((!(y % 4) && y % 100) || !(y % 400)) // Leap year check 
      return 29; 
     else 
      return 28; 
    } 

    var daysInMonthes = [31, 0, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]; 
    return daysInMonthes[m - 1]; 
} 
+0

爲什麼要使用「測試」? – vc2designer

+0

@ vc2designer可能是作者懶得寫4 OR條件,或者他想縮短這段代碼。老實說,這被認爲是一種不好的做法。 –

+0

更好的辦法:) - 返回m === 2?(y%4 ||!(y%100)&&(y%400))?28:29:30+(m +(m >> 3)&1); – vc2designer

0

我意識到它不回答這個問題,但在所有的嚴重性,我認爲一個人需要用錘子在釘子,而不是一個獨輪車和鏟子

在這裏你去開車 - 這個使用Date對象以執行特定日期計算中給出

肛的實例所需的日期

function getDaysInMonth(y, m) { 
    return (new Date(y, m, 0)).getDate(); 
} 
getDaysInMonth(2012, 1); 

這產生相同的結果,而不正則表達式的廢話和「三元」(?:)體操療法替代(用半轉體單ternary前空翻)

function getDaysInMonth(y, m) { 
    return [31, ((!(y % 4) && y % 100 !== 0) || !(y % 400)) ? 29 : 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][m - 1]; 
}; 
0

如果你正在尋找的是一個更可讀的,因爲我會建議開關。

function getDaysInMonth(year, monthIn) 
{ 
    monthIn = monthIn - 1; // For some reasons, the author decided to use 0-based month 

    switch(monthIn){ 
     case 1: // February 
      // Leap year check 
      if ((!(year % 4) && year % 100) || !(year % 400)) 
       return 29; 
      else 
       return 28; 
     case 3 : // April 
     case 5 : // June 
     case 8 : // September 
     case 10: // November 
      return 30; 
     default: // All Other Months 
      return 31; 
    } 
} 
相關問題