Переключатель 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;
    }
}

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

37
задан royhowie 12 June 2015 в 22:19
поделиться

5 ответов

При интерпретации 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");
}

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

Но случай/ветвь 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");
}
97
ответ дан 27 November 2019 в 04:13
поделиться

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

0
ответ дан 27 November 2019 в 04:13
поделиться

Попробуйте:

  • это eclipse.ini
  • запуск затмения с параметром -clean

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

-121--2975479-

Прежде чем я отвечу на этот вопрос, я хочу быть очень ясным, что это хорошая идея только в таких случаях, когда ветви для слияния являются производственными ветвями, а не отраслями развития. Если вы нашли этот пост в поисках способа объединить ветви интеграции (master) во все ваши ветви темы (разработки), ответ, что вы почти наверняка не должны ( см. здесь ).

Хорошо, и реальный ответ. Там нет встроенного способа, потому что (предполагая, что это не быстрый вперед) вы действительно должны иметь файлы, проверенные на git, чтобы сделать его магию слияния. К счастью, на самом деле вы делаете не так много ( git checkout & & git merge ), поэтому не составит труда написать сценарий. Вы можете усложнить это с помощью конфигурационного файла или даже добавить некоторые пользовательские вещи в .git/config (например, git config ветвь. < branchname > .productionbranch true , а затем использовать команды git для проверки, какие ветви имеют этот флаг установлен), но самый простой способ будет следующим:

#!/bin/bash

production_branches=( branch1 branch2 branch3 )

for branch in ${production_branches[@]}; do
    if ! ( git checkout $branch && git merge master ); then
        exit
        # Exit on the first error
        # If you want to just plow ahead, do something like this:
        # git reset --hard       # make sure there aren't merge conflicts in the tree
        # failed_merges="$failed_merges $branch"  # remember for later
    fi
done

# if you plowed ahead above, print the branches which failed to checkout+merge
# if [ -n "$failed_merges" ]; then
#     echo "Failed merges: $failed_merges"
# fi

Есть, как всегда, много улучшений вы Например, можно использовать некоторые команды git, чтобы проверить, был ли мастер уже объединен в данную ветвь, и избежать его извлечения. Если вы двигаетесь по прошлым неудавшимся слияниям, вы можете сделать извлечение и слияние отдельно в случае, если это было извлечение, которое не удалось (это может означать грязное рабочее дерево, что означает, что они все потерпят неудачу). Надеюсь, этого достаточно, чтобы начать!

-121--3007004-

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

1
ответ дан 27 November 2019 в 04:13
поделиться

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

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

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

2
ответ дан 27 November 2019 в 04:13
поделиться

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

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

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

В этом случае я согласен с Гамбо в том, что исправленный если утверждение верное.

Далее следует исходный ответ (предполагается, что OP действительно хотел либо «lol», либо «пока», но не то и другое вместе.)

Утверждение switch , которое ] Гамбо написал не будет работать для count> = 4 по той же причине, что и оригинальный оператор Gumbo if не будет работать: поскольку случаи оцениваются последовательно, count> = 4 подразумевает что второй случай (count> 3) будет выполнен; поэтому скрипт никогда не достигнет теста на 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 он даст оба пока и 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» вызовет другие проблемы).

5
ответ дан 27 November 2019 в 04:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: