A instrução `switch` em JavaScript é um mecanismo de controle de fluxo condicional, notavelmente útil para construir blocos com múltiplas ramificações.
Este guia detalha a funcionalidade da instrução `switch` e suas aplicações, comparando-a com outras estruturas condicionais como `if` e operadores ternários, auxiliando na escolha da ferramenta mais adequada para cada situação.
O que é a Instrução Switch em JavaScript?
A instrução `switch` é utilizada para determinar qual segmento de código executar, baseado no valor de uma dada expressão. É uma das principais estruturas condicionais em JavaScript, complementando a instrução `if` e o operador ternário. Embora compartilhe semelhanças com estas, suas nuances a tornam a opção ideal em certos contextos. Este artigo tem como objetivo explorar essas particularidades em profundidade.
Como Utilizar a Instrução Switch em JavaScript
Nesta seção, apresentarei a estrutura e o uso da instrução `switch`, com exemplos práticos que exigirão um compilador JavaScript. Um compilador online acessível pode ser encontrado aqui. Alternativamente, você pode consultar nosso artigo sobre os melhores IDEs JavaScript online.
Sintaxe Geral
A estrutura básica da instrução `switch` é:
switch(<expressão>) { case <valor 1>: <instruções> break; case <valor 2>: <instruções> break; default: <instruções> }
A palavra-chave `switch` inicia o bloco. Entre parênteses, insere-se uma expressão JavaScript, que pode ser um literal, uma variável ou uma chamada de função, desde que retorne um valor.
O corpo do `switch`, delimitado por chaves, contém múltiplos `case`. Cada `case` é associado a um valor e um conjunto de instruções. Se a expressão avaliada corresponder ao valor de um `case`, as instruções desse `case` serão executadas.
A palavra-chave `break`, opcional, interrompe a execução do bloco `switch`, evitando que os `case` seguintes sejam executados. Sem o `break`, o JavaScript prosseguirá para os próximos `case`, um comportamento conhecido como *fall through*. Exceto quando este comportamento é desejado, o uso de `break` é recomendado.
O `default` é executado quando nenhum dos `case` corresponde à expressão avaliada.
Exemplos
Esta seção demonstrará aplicações práticas da instrução `switch`.
#1. Com Fallthrough
O exemplo abaixo ilustra o uso de `switch` sem `break`, mostrando o comportamento de *fallthrough*:
Neste caso, o código trata diferentes códigos de status HTTP:
const statusCode = <inserir código de status aqui> switch (statusCode) { case 200: console.log('OK'); case 301: console.log('Redirecionamento'); case 403: console.log('Proibido'); case 404: console.log('Não encontrado'); case 500: console.log('Erro Interno do Servidor') }
O código verifica se um valor corresponde a um código de status específico e imprime uma mensagem descritiva.
Note o resultado ao definir o `statusCode` como 403.
Após o `case` 403 ser executado, todos os `case` seguintes também o são. Este é o *fallthrough*. Isso geralmente não é desejado, pois se quer executar um único `case`. Essa peculiaridade da linguagem JavaScript explica a importância de usar a palavra-chave `break`.
#2. Sem Fallthrough
Para evitar o *fallthrough*, adicionamos `break` ao final de cada `case`. O exemplo abaixo demonstra o resultado:
const statusCode = <insira um código de status aqui> switch (statusCode) { case 200: console.log('OK'); break; case 301: console.log('Redirecionamento'); break; case 403: console.log('Proibido'); break; case 404: console.log('Não encontrado'); break; case 500: console.log('Erro Interno do Servidor') break; }
Com o `statusCode` igual a 403, o resultado é:
O código agora executa apenas o `case` correspondente, evitando o *fallthrough*.
#3. Fallthrough Útil
O *fallthrough* pode ser útil em certos casos. Por exemplo, para verificar se um movimento é horizontal ou vertical:
const direction = '<inserir direção aqui>' switch(direction) { case 'esquerda': case 'direita': console.log('movimento horizontal'); break; case 'cima': case 'baixo': console.log('movimento horizontal'); break; }
Definindo a direção como “esquerda”, o resultado é:
E com a direção “direita”, o resultado é o mesmo:
Quando o `case` “esquerda” é correspondido, ele passa para o `case` “direita”, imprimindo “movimento horizontal”. O `break` impede a execução do `case` “cima”. Similarmente, com o `case` “direita” correspondido, as instruções correspondentes são executadas e a execução é interrompida.
O *fallthrough* permite implementar lógica OR em seu código.
#4. Correspondência de Intervalos
A instrução `switch` compara valores. Mas às vezes, verificar se um valor está dentro de um intervalo é necessário. Essa verificação pode ser complexa, mas o exemplo abaixo oferece uma solução:
O exemplo demonstra um programa que imprime uma nota baseada em uma pontuação. Acima de 90, imprime A+, entre 80 e 90, A, e assim por diante.
Para isso, a expressão `true` é inserida nos parênteses, e o valor de cada `case` é uma operação lógica que será verdadeira apenas se a pontuação estiver no intervalo do `case`. Por exemplo, `mark >= 90` só será verdadeiro se a pontuação for maior ou igual a 90, correspondendo ao valor da expressão.
const mark = <substituir pela pontuação>; switch (true) { case mark >= 50 && mark < 60: console.log('D'); break; case mark >= 60 && mark < 70: console.log('C'); break; case mark >= 70 && mark < 80: console.log('B'); break; case mark >= 80 && mark < 90: console.log('A') break; case mark >= 90: console.log('A+') break; default: console.log('<50') }
A saída com pontuação igual a 80 é:
Com pontuação 95:
Com pontuação 45:
Escopo Léxico
As instruções dentro de um `case` não possuem escopo léxico. Variáveis definidas em um `case` são acessíveis em outros. Isso é importante em `switch` que podem executar múltiplos `case`. Veja este exemplo:
switch (true) { case true: let num = 10 case true: console.log(num); }
Ambos os `case` correspondem. No primeiro, definimos a variável `num`; no segundo, acessamos seu valor. Não há erro, como mostrado abaixo:
Diferença entre `switch` e outras condicionais
A instrução `switch` é ideal para testar múltiplas condições. A instrução `if` é adequada para 2 ou 3 condições. Um operador ternário é ideal para expressar uma condicional em uma única linha.
Comece com operadores ternários. Se a lógica for mais complexa, use `if`. Se `if` for insuficiente, então a instrução `switch` é a melhor opção.
Conclusão
Este artigo abordou a instrução `switch`, seu uso, peculiaridades e quando usá-la.
Para aprimorar seus conhecimentos em JavaScript, consulte estas folhas de dicas.