使用switch命令进行日期验证不起作用

时间:2012-01-09 19:15:24

标签: javascript switch-statement

我正在编写一个简单的函数来验证日期。问题是,似乎switch操作符与任何内容都不匹配,maxDay的值仍为0.如果我使用if语句,我没有任何问题。

function validateDateFormat(day,month,year) {
    alert(month); // this was to ensure month was correct and it is!!
    var maxDay = 0;
    switch(month)
    {
        case 01 :     
        case 03 :
        case 05 :
        case 07 :
        case 08 :
        case 10 :
        case 12 : maxDay = 31; break;
        case 04 :
        case 06 :
        case 09 :
        case 11 : maxDay = 30; break;
        case 02 : if(year%4 == 0) maxDay = 29;
              else maxDay = 28;
              break;    
        //default : return " Invalid month -"; break;    
    }
    alert(maxDay);
    if(day > maxDay) {return " Invalid day -";}
    return "";    
}

2 个答案:

答案 0 :(得分:2)

我强烈怀疑根本问题是你提供字符串作为validateDateFormat的参数。如果是这样,那么使用if时的行为肯定会与使用switch时的行为不同。例如,假设您要写这个:

var num = "9";
if (num == 9)
    alert("true");

这将提醒true,因为==(双等号)会在执行比较之前触发num中字符串强制转换为数字。但是,这不会提醒任何事情:

var num = "9";
switch(num) {
    case 9: 
        alert("true");
        break;
}

...因为switch使用更严格的===(三等号)运算符,它不执行类型强制。

然而,这会提醒true

var num = "9";
switch(num) {
    case "9": // string
        alert("true");
        break;
}

...因为我们现在正在比较字符串。

因此,要修复代码,您需要传递实际数字,或修改函数以比较字符串。

注意: section 12.11 of the ECMAScript spec涵盖switch行为。

答案 1 :(得分:0)

您不应在0之前添加数字前缀;这会导致数字文字被解释为八进制。由于08不是有效的八进制数,因此您的脚本可能会生成运行时错误。