这个JS函数是如何工作的

时间:2015-11-16 04:44:29

标签: javascript

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。

3 个答案:

答案 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;
    }
}