这个JavaScript函数有什么问题?

时间:2011-11-24 20:41:15

标签: javascript

我通常不使用JavaScript,也看不出为什么这不起作用。感谢。

function testYear() {
    var dObject = new Date();
    var dRegEx = /^[0-9][0-9]00$/;
    var d = dObject.getFullYear();

    if (d.match(dRegEx) && d % 400 == 0) {
    alert("The year "+d+" is in fact a leap year!");
    //return true;
    }
    else if(!(d.match(dRegEx) && d % 400) && d % 4 == 0) {
    alert("The year "+d+" is in fact a leap year!");
    //return true;
    }
    else {
    alert("The year "+d+" is not a leap year.");
    //return false;
    }
}

4 个答案:

答案 0 :(得分:3)

如果你想要与正则表达式匹配全年,它应该是一个字符串:

var d = ''+dObject.getFullYear();
例如

答案 1 :(得分:3)

此处无需使用正则表达式。只需使用普通的整数运算来查看年份是否可被100整除:

if (d % 100 === 0 && ...)

顺便说一下,如果d % 400 === 0那么d % 100 === 0自动为真,那么额外的测试是不必要的。


一年是公历中的leap year,如果它可以被400整除,或者它可以被4整除,但不能被100整除。请尝试这样:

if ((d % 400 === 0) || (d % 4 === 0 && d % 100 !== 0))
{
    // is leap year
}

答案 2 :(得分:1)

d是一个数字。您需要它是一个字符串才能使用match方法。将其强制转换为字符串的最简单方法是向其添加空字符串:

var d = dObject.getFullYear() + '';

顺便说一句,你应该查看如何查看你的JavaScript控制台,因为那里会记录相关的错误。这将极大地帮助您追踪问题,或至少查明问题所在。

答案 3 :(得分:1)

忘记正则表达式,这只是错误的方法。当你的整个功能可以被(几乎)一个单行代替时,我无法弄清楚究竟出了什么问题,但是d是一个数字,所以你不能在它上面使用match() 。您不需要测试它是否可被100 整除,可被400整除 - 后者意味着前者。

function testYear() {
   var year = (new Date()).getFullYear();

   if (year % 400 === 0 || (year % 4 === 0 && year % 100 != 0)) {
      alert("The year " + year + " is in fact a leap year!");
      //return true;
   } else {
      alert("The year "+year+" is not a leap year.");
      //return false;
   }

   // OR, if you don't need the alerts and only care about the
   // return value you can just do this:
   return year % 400 === 0 || (year % 4 === 0 && year % 100 != 0);
}