Подтвердить что ты не робот

Переключатель JavaScript с логическими операторами?

for (var count = 1; count < 6; count++) {
    switch (count) {
        case (2):   document.write("hi"); break;     
        case (count > 3):   document.write("bye"); break;    
        case (count >= 4): document.write("lol"); break;
    }
}

Потому что он не работает так, как я ожидаю, а не для печати bye и lol, это заставляет меня думать, что это неверно в JavaScript. Я попытался найти несколько примеров, чтобы увидеть, делают ли люди это в Google, и я не видел ничего. Так это действительно или нет? или Почему это может не сработать?

4b9b3361

Ответ 1

Когда switch интерпретируется, выражение в круглых скобках сравнивается со значениями конкретных случаев.

Итак, в вашем случае значение count будет сравниваться со значениями 2, count > 3 и count >= 4. И это не сработает. Хотя вы можете переписать его и сравнить с true, чтобы заставить его работать:

switch (true) {
    case (count == 2):
        document.write("hi");
        break;
    case (count > 3):
        document.write("bye");
        break;
    case (count >= 4):
        document.write("lol");
        break;
}

Но это не значит, что switch предполагается использовать.

Вместо этого используйте if:

if (count == 2) {
    document.write("hi");
} else if (count > 3) {
    document.write("bye");
} else if (count >= 4) {
    document.write("lol");
}

Изменить. Поскольку вы используете только случаи switch (перерыв, если соответствует случаю), мой перевод switch -to- if/else верен.

Но case/branch count >= 4 никогда не будет применяться, поскольку count > 3 является истинным (также) для count значений больше или равно 4.

Чтобы устранить эту проблему (напишите "bye" и "lol" для значений больше или равных 4), удалите последний else, чтобы сделать последний оператор if независимым от предыдущего:

if (count == 2) {
    document.write("hi");
} else if (count > 3) {
    document.write("bye");
}
if (count >= 4) {
    document.write("lol");
}

Ответ 2

Вы используете аргумент case неправильно. Вы должны указать значение, которое будет сравниваться со значением в предложении switch... и не булево выражение, подобное этому count>2

В этом случае это булевское выражение будет передано в true или false (1 или 0) и сравнивается с вашим значением, а иногда может работать, иногда - нет.

Вы должны рассмотреть возможность замены его операторами if.

Ответ 3

Это исправление для ответа Gumbo. Я пишу отдельный ответ только потому, что это не подходит как комментарий.

Изменить: Гумбо предложил в комментарии, что я, возможно, неправильно понял намерение Дуга. Если OP действительно хочет распечатать "bye" и "lol" для count >= 4, нам нужно удалить break из switch. Случаи теперь возвращаются в первоначальном порядке, так что "bye" и "lol" печатаются в этом порядке (что, по-видимому, является намерением OP).

switch (true) {
    case (count == 2):
        document.write("hi");
        break;
    case (count > 3):
        document.write("bye");
        // No break here; just fall through.
    case (count >= 4):
        document.write("lol");
        break;
}

В этом случае я согласен с Gumbo в том, что исправленный оператор if верен.

Далее следует оригинальный ответ (предполагается, что OP действительно хотел, чтобы либо "LOL", либо "Bye" для печати, но не оба.)

Оператор switch, который написал Gumbo, не будет работать для count >= 4, по той же причине, что и утверждение Gumbo original if не будет work: Поскольку случаи оцениваются последовательно, count >= 4 подразумевает, что будет выполнен второй случай (count > 3); поэтому script никогда не достигнет теста для count >= 4. Чтобы исправить это, тесты должны выполняться в обратном порядке, от самого высокого до самого низкого:

switch (true) {
    case (count >= 4):
        document.write("lol");
        break;
    case (count > 3):
        document.write("bye");
        break;
    case (count == 2):
        document.write("hi");
        break;
}

Скорректированный оператор if все еще не является правильным, потому что для count >= 4 он выдаст как bye, так и lol на выходе. Опять же, тесты на лестнице if должны быть организованы так, чтобы идти от наивысших до самых низких значений:

if (count >= 4) {
    document.write("lol");
} else if (count > 3) {
    document.write("bye"); 
} else if (count == 2) {
    document.write("hi");
}

Это не идеальный пример, потому что если count является целым числом, то оценка count >= 4 и count > 3 приведет к тем же результатам - true для count >= 4, false в противном случае. Это не так, если count является значением с плавающей запятой (но тогда значение с плавающей запятой с именем "count" вызовет другие проблемы.)

Ответ 4

Вы должны поменять свои последние два случая.

Ответ 5

switch обычно требуется условие фиксированное условие/значение; потому что ваша переменная count изменяется каждый раз, она идет вразрез с этим. Вместо этого используйте условие if-else.