Переключатель без перерыва в Javascript - PullRequest
0 голосов
/ 25 февраля 2020
drink = 'beer'

switch(drink){
    case 'beer':
    case 'whiskey':
        console.log('The drink is BEER or WHISKEY');
    case 'juice':
        console.log('The drink is JUICE');
    default:
        console.log('Nothing to drink');

}

Для моего кода выше, почему я получаю все три сообщения в консоли. Может кто-нибудь, пожалуйста, объясните. Без перерыва я ожидал, что будет напечатано сообщение о деле и сообщение по умолчанию, но почему сок также есть в сообщениях консоли.

Ответы [ 4 ]

1 голос
/ 26 февраля 2020

Согласно справочнику оператора , «если вы забудете перерыв, сценарий будет выполняться из случая, когда критерий удовлетворен, и после этого будет запускать случаи независимо от того, был ли критерий соблюден». Таким образом, внутри оператора switch, когда оператор case соответствует заданной переменной, все последующие операторы будут выполняться , игнорируя критерии, пока не встретится оператор break или закрывающая фигурная скобка.

Если вы переписали бы свой код к этому, на выходе будут только «Питье - это пиво или виски» и «Нечего пить».

drink = 'beer'

switch(drink){
    case 'juice':
        console.log('The drink is JUICE');
    case 'beer':
    case 'whiskey':
        console.log('The drink is BEER or WHISKEY');
    default:
        console.log('Nothing to drink');
}
0 голосов
/ 26 февраля 2020

Это из-за 'Fallthrough' (Подробнее здесь: https://en.wikipedia.org/wiki/Switch_statement#Fallthrough).

В некоторых языках (например, JavaScript и C) операторы переключения ведут себя так, что они выполнят соответствующий блок и затем упадет к следующим инструкциям. Вот почему нам нужно сломать ;, это выйдет из блока переключателей.

Поиграйте с ним, чтобы увидеть поведение. Вы не разбиваете после случая с пивом, поэтому все блоки выполняются, поскольку пиво - это первый проверенный случай, и он совпадает. Если вы поменяете напиток на сок, будут выполнены только последние 2 блока; соответствующий случай и следующий случай.

0 голосов
/ 26 февраля 2020

Вы можете использовать функцию

const res = ((val) => {
  if (['beer', 'whiskey'].includes(val)) return 'The drink is BEER or WHISKEY'
  if (val === 'juice') return 'The drink is JUICE'
  return 'Nothing to drink'
})(drink)

console.log(res)
0 голосов
/ 26 февраля 2020

Переключение регистров в javascript по умолчанию «проваливается», если не используется оператор break или return.

Для желаемой операции вы можете написать это так:

drink = 'beer'

switch(drink){
    case 'beer':
    case 'whiskey':
        console.log('The drink is BEER or WHISKEY');
        break;
    case 'juice':
        console.log('The drink is JUICE');
        break;
    default:
        console.log('Nothing to drink');

}
...