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.