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。
答案 0 :(得分: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)
这与以下内容相同,但使用RegExp:
if (m == 8 || m == 3 || m == 5 || m == 10)
当可能不使用它时使用RegExp被认为是一种不好的做法。这绝对不是计算这个的最好的函数,我见过。
用户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];
}
答案 1 :(得分:0)
我意识到它没有回答这个问题,但是我认为人们需要用锤子来钉钉子而不是手推车和铲子
这里你去 - 这使用Date对象为Date执行Date特定的计算
function getDaysInMonth(y, m) {
return (new Date(y, m, 0)).getDate();
}
getDaysInMonth(2012, 1);
这产生了相同的结果,没有RegExp的废话和"三元" (?
:
)在给出的例子中需要体操
另一种选择(单个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];
};
答案 2 :(得分: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;
}
}