Além da condicional if, o JavaScript também tem a instrução switch para executar lógica de forma condicional.
Ela é usada quando uma única variável precisa ser comparada com várias variantes.
A comparação é feita verificando a igualdade estrita (===), veja o conceito de comparação.
Para uma variável x qualquer, a instrução switch em JavaScript tem a seguinte sintaxe.
switch (x) {
case option1:
// code that is executed when "x === option1" is true
break;
case option2:
// code that is executed when "x === option2" is true
break;
default:
// code that is executed when x does not equal any of the
// options
}
O caso default é opcional e serve para quando você quer executar algum código se nenhuma das outras opções corresponder à variável.
As instruções break acima são necessárias porque, por padrão, todos os casos têm “fallthrough” em JavaScript.
Isso significa que, sem nenhuma instrução break, todo o código dos casos abaixo da primeira opção correspondente seria executado, mesmo que x não correspondesse a essas opções.
Esse comportamento de “fallthrough por padrão” é uma armadilha comum ao usar switch em JavaScript.
Dentro de uma função, return também pode ser usado no lugar de break para evitar esse problema.
Você pode usar o comportamento de fallthrough a seu favor quando quiser aplicar o mesmo código a vários casos. Você encontra um exemplo disso na documentação da MDN.
Por padrão, as variáveis nas diferentes instruções case compartilham o mesmo escopo.
Isso pode levar a um comportamento inesperado.
Por exemplo, ao copiar e colar um caso, você pode acabar com uma declaração let message em dois casos, o que resulta em um erro. Veja a documentação da MDN.
Para evitar problemas por causa do escopo compartilhado, você pode criar um escopo separado para cada instrução case adicionando blocos de código com chaves para cada caso.
switch (x) {
case option1: {
// Variables declared here are contained to this case.
break;
}
case option2: {
// ...
break;
}
default: {
// ...
}
}
Em vez de uma variável x, você também pode usar uma expressão.
Essa expressão é avaliada uma vez no início da instrução switch e o resultado é comparado com os casos.
Um uso comum disso é um “switch de tipo”, que executa códigos diferentes dependendo do tipo de uma variável.
switch (typeof x) {
case 'string':
// code that is executed when x is a string
break;
case 'number':
// code that is executed when x is a number
break;
default:
// code that is executed when x has some other type
}
As opções também podem ser expressões.