Проверка даты с помощью команды switch не работает - PullRequest
2 голосов
/ 09 января 2012

Я пишу простую функцию для проверки даты.Проблема в том, что оператор переключения ничего не соответствует, и значение 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 ]

2 голосов
/ 09 января 2012

Я сильно подозреваю, что основная проблема заключается в том, что вы предоставляете строки в качестве аргументов validateDateFormat. Если это так, то при использовании if поведение может определенно отличаться от поведения при использовании switch. Например, предположим, что вы должны были написать это:

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

Это предупредит true, потому что == (double-equals) запускает приведение строки в num к числу перед выполнением сравнения. Однако это ничего не предупредит:

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

... потому что switch использует более строгий оператор === (triple-equals), который не выполняет приведение типов.

Это, однако, предупреждает true:

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

... потому что мы сейчас сравниваем строки.

Итак, чтобы исправить ваш код, вам нужно либо передать действительные числа, либо изменить функцию для сравнения строк.

Примечание: Поведение switch описано в разделе 12.11 спецификации ECMAScript .

0 голосов
/ 09 января 2012

Вы не должны ставить перед вашими номерами 0;это приводит к тому, что числовой литерал интерпретируется как восьмеричный.Поскольку 08 не является действительным восьмеричным числом, ваш сценарий может генерировать ошибку времени выполнения.

...