Eu recomendo que não use switch(true)
. Só porque algo “funciona”, não quer dizer que seja o certo. switch
é excelente para avaliar um único valor, mas usá-lo assim para avaliar condições é um uso torto. Até porque dá pra ser bem mais simples com if
/else
:
var peso = parseFloat(window.prompt("Digite o seu peso (Use o ponto para casas decimais ao invés da virgula)"));
var altura = parseFloat(window.prompt("Digite a sua altura (Use o ponto para casas decimais ao invés da virgula)"));
if (isNaN(peso) || isNaN(altura)) {
alert('Você deve digitar números');
} else if (peso <= 0 || altura <= 0) {
alert('Peso e altura devem ser positivos');
} else {
var imc = peso / Math.pow(altura, 2);
// como eu validei peso e altura antes, aqui eu sei que IMC sempre é positivo
var msg;
if (imc < 17) {
msg = 'Você está muito abaixo do peso';
} else if (imc < 18.5) {
msg = 'Você está abaixo do peso';
} else if (imc < 24.5) {
msg = 'Você está com o peso normal';
} else if (imc < 30) {
msg = 'Você está com sobrepeso';
} else if (imc < 40) {
msg = 'Você está com obesidade';
} else {
msg = 'Você está com obesidade grave';
}
alert(`${msg}, seu IMC é ${imc}`);
}
Primeiro eu valido se foi digitado mesmo um número (tento converter com parseFloat
e vejo se o retorno é NaN
), e também vejo se o valor é um número positivo, assim eu garanto que o IMC não será negativo.
Depois, troquei o switch
por if
/else
, que fica mais simples. No primeiro if
vejo se é menor que 17. Se não for, ele vai pro else if
, e se chegou aqui é porque com certeza não é menor que 17, então não preciso verificar isso de novo: basta ver se é menor que 18.5
. Se não for, ele cai no próximo else if
e eu não preciso verificar de novo o 18.5
, basta verificar a outra condição.
Por fim, se chegou no último else
é porque é maior ou igual a 40, então nem if
precisa.
Agora imagine que você quer colocar mais alguma condição no meio (por exemplo, entre 35 e 40). Bastaria adicionar mais um else if (imc < 35)
antes do else if (imc < 40)
. Já no switch
você teria que mudar em 2 lugares, já que você testa o valor inicial e final de cada intervalo (ou seja, além de ser um uso torto, ainda dá mais trabalho).
Outro detalhe é que você testa imc <= 18.4
, então se o IMC for 18.41
ele não entra nesse caso e nem no imc >= 18.5
. Eu preferi colocar imc < 18.5
, pois aí mesmo se for 18.49999
, ainda entra neste if
.