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函數是如何工作的
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函數是如何工作的
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];
}
爲什麼要使用「測試」? – vc2designer
@ vc2designer可能是作者懶得寫4 OR條件,或者他想縮短這段代碼。老實說,這被認爲是一種不好的做法。 –
更好的辦法:) - 返回m === 2?(y%4 ||!(y%100)&&(y%400))?28:29:30+(m +(m >> 3)&1); – vc2designer
我意識到它不回答這個問題,但在所有的嚴重性,我認爲一個人需要用錘子在釘子,而不是一個獨輪車和鏟子
在這裏你去開車 - 這個使用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];
};
如果你正在尋找的是一個更可讀的,因爲我會建議開關。
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;
}
}
您是否在尋找關於該功能如何工作的解釋,或者您是否在尋找一種不太複雜的解決方案? –
@AustinBrunkhorst編寫一個更具可讀性的函數,謝謝 – vc2designer
我想編輯這個問題,但它傷害了我的腦海。他想要加密嗎?或者瞭解它做了什麼?當問題如此時,程序是什麼?可疑的。 – Spaceman