Uma instrução switch
pode substituir várias verificações if
.
Oferece uma maneira mais descritiva de comparar um valor com múltiplas variantes.
O switch
possui um ou mais blocos case
e um padrão opcional.
Parece assim:
mudar(x) { case 'valor1': // if (x === 'valor1') ... [quebrar] case 'valor2': // if (x === 'valor2') ... [quebrar] padrão: ... [quebrar] }
O valor de x
é verificado quanto a uma igualdade estrita com o valor do primeiro case
(ou seja, value1
), depois com o segundo ( value2
) e assim por diante.
Se a igualdade for encontrada, switch
passa a executar o código a partir do case
correspondente, até o break
mais próximo (ou até o final do switch
).
Se nenhum caso for correspondido, o código default
será executado (se existir).
Um exemplo de switch
(o código executado está destacado):
seja a = 2 + 2; mudar (a) { caso 3: alerta('Muito pequeno'); quebrar; caso 4: alerta('Exatamente!'); quebrar; caso 5: alerta('Muito grande'); quebrar; padrão: alert("Não conheço esses valores"); }
Aqui o switch
começa a comparar a
da primeira variante case
que é 3
. A partida falha.
Então 4
. Isso é uma correspondência, então a execução começa do case 4
até o break
mais próximo.
Se não houver break
, a execução continua com o próximo case
sem nenhuma verificação.
Um exemplo sem break
:
seja a = 2 + 2; mudar (a) { caso 3: alerta('Muito pequeno'); caso 4: alerta('Exatamente!'); caso 5: alerta('Muito grande'); padrão: alert("Não conheço esses valores"); }
No exemplo acima veremos a execução sequencial de três alert
s:
alerta('Exatamente!'); alerta('Muito grande'); alert("Não conheço esses valores");
Qualquer expressão pode ser um argumento switch/case
Tanto switch
quanto case
permitem expressões arbitrárias.
Por exemplo:
deixe a = "1"; seja b = 0; interruptor (+a) { caso b + 1: alert("isso é executado, porque +a é 1, é exatamente igual a b+1"); quebrar; padrão: alert("isso não funciona"); }
Aqui +a
dá 1
, que é comparado com b + 1
em case
, e o código correspondente é executado.
Diversas variantes de case
que compartilham o mesmo código podem ser agrupadas.
Por exemplo, se quisermos que o mesmo código seja executado para case 3
e para case 5
:
seja a = 3; mudar (a) { caso 4: alerta('Certo!'); quebrar; caso 3: // (*) agrupou dois casos caso 5: alerta('Errado!'); alert("Por que você não faz aula de matemática?"); quebrar; padrão: alert('O resultado é estranho. Sério.'); }
Agora, 3
e 5
mostram a mesma mensagem.
A capacidade de “agrupar” casos é um efeito colateral de como switch/case
funciona sem break
. Aqui a execução do case 3
começa na linha (*)
e passa pelo case 5
, pois não há break
.
Ressaltamos que a verificação da igualdade é sempre rigorosa. Os valores devem ser do mesmo tipo para corresponder.
Por exemplo, vamos considerar o código:
deixe arg = prompt("Insira um valor?"); mudar (arg) { caso '0': caso '1': alerta('Um ou zero'); quebrar; caso '2': alerta('Dois'); quebrar; caso 3: alert('Nunca executa!'); quebrar; padrão: alert('Um valor desconhecido'); }
Para 0
, 1
, o primeiro alert
é executado.
Para 2
o segundo alert
é executado.
Mas para 3
, o resultado do prompt
é uma string "3"
, que não é estritamente igual ===
ao número 3
. Portanto, temos um código morto no case 3
! A variante default
será executada.
importância: 5
Escreva o código usando if..else
que corresponderia à seguinte switch
:
mudar (navegador) { caso 'Edge': alert("Você tem vantagem!"); quebrar; caso 'Chrome': caso 'Firefox': caso 'Safari': caso 'Ópera': alert('Ok, nós também oferecemos suporte a esses navegadores'); quebrar; padrão: alert( 'Esperamos que esta página esteja ok!' ); }
Para corresponder precisamente à funcionalidade de switch
, o if
deve usar uma comparação estrita '==='
.
Porém, para determinadas strings, um simples '=='
também funciona.
if(navegador == 'Edge') { alert("Você tem vantagem!"); } else if (navegador == 'Chrome' || navegador == 'Firefox' || navegador == 'Safari' || navegador == 'Ópera') { alert('Ok, nós também oferecemos suporte a esses navegadores'); } outro { alert( 'Esperamos que esta página esteja ok!' ); }
Observação: a construção browser == 'Chrome' || browser == 'Firefox' …
é dividido em várias linhas para melhor legibilidade.
Mas a construção switch
ainda é mais limpa e descritiva.
importância: 4
Reescreva o código abaixo usando uma única instrução switch
:
deixe a = +prompt('a?', ''); se (uma == 0) { alerta(0); } se (uma == 1) { alerta(1); } se (uma == 2 || uma == 3) { alerta('2,3'); }
As duas primeiras verificações se transformam em dois case
. A terceira verificação é dividida em dois casos:
deixe a = +prompt('a?', ''); mudar (a) { caso 0: alerta(0); quebrar; caso 1: alerta(1); quebrar; caso 2: caso 3: alerta('2,3'); quebrar; }
Atenção: a break
na parte inferior não é necessária. Mas nós o colocamos para tornar o código à prova de futuro.
No futuro, há uma chance de querermos adicionar mais um case
, por exemplo case 4
. E se esquecermos de adicionar um break antes dele, no final do case 3
, haverá um erro. Então isso é uma espécie de autosseguro.