Erro comum que ocorre na condicional SWITCH do JavaScript
- #JavaScript
Descrição do Problema
Trabalho com linguagens de programação há quase 20 anos e pude ver diversos erros de codificação que ocorrem com frequência em cada uma delas. No caso do JavaScript, comecei o estudo há muito pouco tempo e pude verificar que muitas falhas ocorrem exatamente devido a sua característica de tipagem dinâmica. As mesmas características de flexibilidade que a linguagem oferece e que são consideradas uma vantagem, muitas vezes provocam erros que são difíceis de serem identificados.
Neste artigo pretendo apresentar um erro que ocorreu durante a utilização de CONDICIONAIS em JavaScript. O erro que vou mostrar e que motivou este artigo, ocorreu durante uma aula na própria DIO. Como não aconteceu com o professor da disciplina, ele provavelmente não identificou como erro naquele momento, mas eu havia feito o teste com valores diferentes nas variáveis e por isso meu código apresentou uma solução bem estranha. Consultando a IA Gemini do Google, consegui entender onde havia errado e pude efetuar a correção, conforme relato abaixo.
O código abaixo trata-se da utilização do Condicional SWITCH - CASE para avaliar se uma nota final de um aluno está em uma das seguintes condições:
- abaixo de 5: deve apresentar a mensagem "Abaixo da média".
- entre 5 e 7: deve apresentar a mensagem "Na média".
- acima ou igual a 7: deve apresentar a mensagem "Acima da média".
O código-exemplo que inicialmente fiz apresentava a seguinte estrutura:
const nota = 2;
console.log("Análise da nota ", nota);
switch(nota){
case (nota < 5):
console.log("Abaixo da média!");
break;
case (nota < 7):
console.log('Na média!');
break;
default:
console.log("Acima da média!");
}
Quando era executado, a resposta era sempre "Acima da média!", mesmo com valores de nota muito inferiores a 5.
----------------------------------------------------------------------------------------------------
Diagnóstico do Problema
Consultando o Gemini, entendi o seguinte:
- O valor entre parênteses do SWITCH (no caso o valor da variável "nota") é sempre comparado com o resultado da expressão a frente do CASE (no caso, expressões booleanas tais como "nota < 5").
- Se pegarmos o primeiro CASE, "nota < 5" será igual a TRUE, porém a comparação que o SWITCH faz é entre o valor de NOTA (no caso 2) com o valor de "(nota <5)", que é TRUE.
- Assim, a primeira comparação realizada é "5 == (nota <5)" ou "5 == TRUE"?
- Obviamente, essa comparação irá ser igual a FALSE, e portanto, o SWITCH não entra no primeiro CASE.
- O mesmo vai ocorrer com os demais CASES, sobrando apenas a cláusula do DEFAULT (por falta) para ser executada.
- Por isso, qualquer que fosse o valor da nota, sempre iria resultar na apresentação da cláusula DEFAULT.
-----------------------------------------------------------------------------------------------------------------------------------------------------------
Como Resolver o Erro?
Uma solução simples sugerida pela IA do Gemini foi colocar como argumento do SWITCH um simples TRUE, pois desta forma, este valor booleano seria comparado com o resultado das expressões booleanas que se encontram nos CASES. O código então ficaria assim:
const nota = 2;
console.log("Análise da nota ", nota);
switch(true){
case (nota < 5):
console.log("Abaixo da média!");
break;
case (nota < 7):
console.log('Na média!');
break;
default:
console.log("Acima da média!");
}
O resultado é que, a execução do código só vai entrar na condição case que seja "verdadeira", ou seja, que assume o valor 'true'.
-------------------------------------------------------------------------------------------------------------------------------------------------------------
Conclusão
Com essa alteração básica, o código passou a funcionar corretamente e a dar as mensagens esperadas para cada valor de nota apresentado. Mas fica, a observação de que o motivo da falha foi o meu entendimento equivocado sobre como o SWITCH deveria funcionar. Esse tipo de problema não é específico de JavaScript. O uso de SWITCH ocorre em diversas linguagens de programação, e portanto, a questão importante é a necessidade de regularmente revisar e consolidar o entendimento dos fundamentos de linguagens de programação. A falta de uma base bem consolidada geralmente é a responsável por esse tipo de erro.