Переключить вывод оператора - JavaScript - PullRequest
0 голосов
/ 31 мая 2018

У меня есть проблема, когда я не могу обернуться, почему ответ такой, какой он есть.Вопрос в том, что приведенный ниже фрагмент кода будет выводить, когда значение a равно 8.

var n = ""
switch(a) {
    case 8:
        n += "bra ";
    case 10:
        n = "jon";
    case 12:
        n += "ny";
}
console.log(n);

Моим первым предположением было «бюстгальтер», потому что, поскольку a = 8, ввод будет соответствовать первому утверждению case и, следовательно,concat "бюстгальтер"Решение, однако, гласит «Джонни» в качестве ответа.

Может кто-нибудь объяснить, что мне здесь не хватает?Я был бы очень благодарен.Пожалуйста, знайте, что я новичок в JS, поэтому я, возможно, пропустил что-то тривиальное.

Ответы [ 4 ]

0 голосов
/ 31 мая 2018

Следует отметить, что в JavaScript требуется оператор break, чтобы предотвратить переход элемента управления в последующие случаи.

var n = ""
switch(a) {
    case 8:
        n += "bra ";  //n = "" + "bra " = "bra "
        //no break statement here, control falls through to the next case        
    case 10:
        n = "jon";    //n = "jon"
        //no break statement here, control falls through to the next case
    case 12:
        n += "ny";    //n = "jon" + "ny" = "jonny"
}
console.log(n);
0 голосов
/ 31 мая 2018

var n = "";
let a=8;
switch(a) {
    case 8:
        n += "bra ";
        break;
    case 10:
        n = "jon";
        break;
    case 12:
        n += "ny";
        break;
}
console.log(n);

Чтобы switch работал, вам нужно break в каждом случае, как указано выше.Когда он без перерыва, программа будет проходить весь путь от случая 8 к случаю 12, что приводит к следующей последовательности

//case 8:  n = ""+bra
//case 10: n = jon
//case 12: n = jon+ny

В результате n наконец равно jonny

0 голосов
/ 31 мая 2018
Оператор

A switch просто переходит на соответствующую метку case.Вот и все.

Таким образом, для 8 вы получите:

switch(a) {

a равно 8, поэтому перейдите к case 8.

    case 8:

Эй, это наша остановка.Продолжите выполнение здесь.

        n += "bra ";

Добавьте "bra " к n.

    case 10:

Другой ярлык.Выполнение метки ничего не делает.

        n = "jon";

Установите n на "jon".

    case 12:

Другая метка.Продолжайте.

        n += "ny";

Добавьте "ny" к n.

}

Теперь n равно "jonny".

Если вы хотите остановитьвыполнение внутри switch, вам необходим явный break;:

switch(a) {
    case 8:
        n += "bra ";
        break;
    case 10:
        n = "jon";
        break;
    case 12:
        n += "ny";
        break;  // technically redundant; this is the end of the switch block
}

. Именно поэтому вы обычно видите break после каждой case группы операторов.

ByКстати, такое поведение называется «просчет» и было унаследовано от C.

0 голосов
/ 31 мая 2018

Поскольку ключевое слово break не используется, логика эффективно «провалится» через все ветви переключателей, начиная с той, которая удовлетворяет условию.( О чем вы можете прочитать здесь ).

Итак, в вашем примере все дела будут обработаны.Это то же самое, что и:

n += "bra ";
n = "jon";
n += "ny";

Для которого результат очевидно: "jonny"


Если вы хотите обработать только выбранный оператор switch, то выможно добавить ключевое слово break примерно так:

switch(a) {
    case 8:
        n += "bra ";
        break;
    case 10:
        n = "jon";
        break;
    case 12:
        n += "ny";
        break;
}
...