O switch verifica uma expressão, caso o valor da expressão corresponda a uma condição, ele executa o código associado àquela condição.
Syntax
switch (expression) { case value1: //Statements executed when the result of expression matches value1 [break;] case value2: //Statements executed the result of expression matches value2 [break;] ... case valueN: //Statements executed when the result of expression matches valueN [break;] default: //Statements executed when none of the values match the value of the expression [break;] }
expression
- Uma expressão comparada a cada condição.
case valueN
- Um
case
usado para comparar aexpressão
. statementsN
- Códigos executados se a
expression
for verdadeira comparada à condição. statements_def
- Códigos executados se a
expression
não corresponder à nenhuma condição.
Descrição
Se uma correspondência é encontrada, os códigos associados serão executados. Se mais de uma condição corresponder ao valor dado, apenas a primeira é selecionada, mesmo se as outras condições não forem iguais.
O Switch
primeiro procura por uma condição case
cuja expressão resulta no mesmo valor que a expressão de entrada (usando strict comparison, ===)
e então transfere o controle para aquele case
, executando os códigos associados. Se não houver combinações com o case
, o switch procura pelo valor default
(padrão), se encontrado, dá controle para aquele case
, executando o código associado. Não havendo default
, o case
mais próximo ao fim do switch
será executado. Por convenção, o default
case
é considerado a última condição, mesmo não precisando ser.
O break
associado a cada case
certifica que o switch pare quando uma correspondência for encontrada e continue no código após ele. Se não houver break
, executará o próximo case
sem validá-lo.
Exemplo
Usando o switch
No exemplo a seguir, se expr
retornar "Bananas", o código combina com o valor do case
"Bananas" e executa o código associado. Quando um break
é achado, o programa sai do switch
e executa o código que o segue. Se break
for omitido, o código do case
"Cherries" também será executado.
switch (expr) { case "Oranges": console.log("Oranges are $0.59 a pound."); break; case "Apples": console.log("Apples are $0.32 a pound."); break; case "Bananas": console.log("Bananas are $0.48 a pound."); break; case "Cherries": console.log("Cherries are $3.00 a pound."); break; case "Mangoes": case "Papayas": console.log("Mangoes and papayas are $2.79 a pound."); break; default: console.log("Sorry, we are out of " + expr + "."); } console.log("Is there anything else you'd like?");
O que acontece se eu esquecer do break
?
Se você esquecer um break
o script vai executar o case
do critério encontrado, e também o caso após ele sem validá-lo. Veja o exemplo:
var foo = 0; switch (foo) { case -1: console.log('negative 1'); break; case 0: // foo is 0 so criteria met here so this block will run console.log(0) // NOTE: the forgotten break would have been here case 1: // no break statement in 'case 0:' so this case will run as well console.log(1); break; // it encounters this break so will not continue into 'case 2:' case 2: console.log(2); break; default: console.log('default'); }
Métodos para múltiplos casos
Esta técnica foi inspirada em:
Switch statement multiple cases in JavaScript (Stack Overflow)
Múltiplos casos - operação única
Este método toma vantagem do fato de que se não houver break
abaixo de um case
ele continuará a executar o próximo case
de qualquer jeito, correspondendo ou não. Veja a seção com o título "O que acontece se eu esquecer do break
?"
Este é um exemplo de um switch de uma única operação sequencial, onde quatro valores diferentes fazem exatamente o mesmo.
var Animal = 'Giraffe'; switch (Animal) { case 'Cow': case 'Giraffe': case 'Dog': case 'Pig': console.log('This animal will go on Noah\'s Ark.'); break; case 'Dinosaur': default: console.log('This animal will not.'); }
Múltiplos casos - operações encadeadas
Este é um exemplo de um switch sequencial multi-operacional, onde, dependendo do número dado, você receberá diferentes resultados. Mostra que ele irá analisar na ordem que você por os case statements
, e não precisa ser numericamente sequencial. Em JavaScript, pode-se até mesclar strings
nos cases
também.
var foo = 1; var output = 'Output: '; switch (foo) { case 10: output += 'So '; case 1: output += 'What '; output += 'Is '; case 2: output += 'Your '; case 3: output += 'Name'; case 4: output += '?'; console.log(output); break; case 5: output += '!'; console.log(output); break; default: console.log('Please pick a number from 0 to 6!'); }
Resultados deste exemplo:
Value | Log text |
---|---|
foo is NaN or not 1, 2, 3, 4, 5 or 10 | Please pick a number from 0 to 6! |
10 | Output: So What Is Your Name? |
1 | Output: What Is Your Name? |
2 | Output: Your Name? |
3 | Output: Name? |
4 | Output: ? |
5 | Output: ! |
Especificações
Specification | Status | Comment |
---|---|---|
{{SpecName('ES3')}} | {{Spec2('ES3')}} | Initial definition. Implemented in JavaScript 1.2 |
{{SpecName('ES5.1', '#sec-12.11', 'switch statement')}} | {{Spec2('ES5.1')}} | |
{{SpecName('ES6', '#sec-switch-statement', 'switch statement')}} | {{Spec2('ES6')}} |
Compatibilidade de navegadores
{{CompatibilityTable}}
Feature | Chrome | Firefox (Gecko) | Internet Explorer | Opera | Safari |
---|---|---|---|---|---|
Basic support | {{CompatVersionUnknown}} | {{CompatVersionUnknown}} | {{CompatVersionUnknown}} | {{CompatVersionUnknown}} | {{CompatVersionUnknown}} |
Feature | Android | Chrome for Android | Firefox Mobile (Gecko) | IE Mobile | Opera Mobile | Safari Mobile |
---|---|---|---|---|---|---|
Basic support | {{CompatVersionUnknown}} | {{CompatVersionUnknown}} | {{CompatVersionUnknown}} | {{CompatVersionUnknown}} | {{CompatVersionUnknown}} | {{CompatVersionUnknown}} |