A minha variável não está sendo impressa dentro do switch

Alguém poderia me informar por que minha variável não está imprimindo o valor do IMC dentro do switch no alert?

    <script>
        var peso = window.prompt("Digite o seu peso (Use o ponto para casas decimais ao invés da virgula)");
        var altura = window.prompt("Digite a sua altura (Use o ponto para casas decimais ao invés da virgula)");
        var imc = peso / Math.pow(altura,2);
        
        switch (true) {
            case imc >= 16 && imc <= 16.9:
                alert('Você está muito abaixo do peso, seu IMC é:', imc);
                break;
            case imc >= 17 && imc <= 18.4:
                alert('Você está abaixo do peso, seu IMC é:', imc);
                break;
            case imc >= 18.5 && imc <= 24.9:
                alert('Você está com o peso normal, seu IMC é:', imc);
                break;
    </script>

Fiz um teste com o peso 70kg e altura 1.80m, e o alert está me retornando apenas: “Você está com o peso normal, seu IMC é:” sem me informar o valor do IMC

Pelo que vi na documentação, o alert() só aceita um argumento e vc tá passando 2.

Tente assim:

alert(`Seu imc está abaixo: ${imc}`);

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.

1 curtida