本文详解为何在bmi计算器中直接用switch(bmi)配合布尔表达式作为case会导致始终执行default,并提供两种专业、可维护的修复方案:if-else链与switch(true)技巧。
在JavaScript中,switch语句的工作机制是严格全等比较(===):它将switch括号内的表达式值,依次与每个case后的字面量值进行匹配。而你在代码中写的是:
switch(bmi) {
case bmi < 18.5: // ❌ 这里不是值,而是布尔表达式!运行时计算为 true/false
description = 'Cuidado! Você está abaixo do peso!';
break;
// ...
}问题在于:bmi是一个数字(如 22.35),而每个case后却是一个布尔表达式(如 bmi
✅ 正确解法一:使用 switch(true)
这是最贴近你原始结构的优雅修复。它让每个 case 的布尔表达式“控制是否命中”,逻辑清晰且保持switch语法优势:
switch (true) {
case bmi < 18.5:
description = 'Cuidado! Você está abaixo do peso!';
value.classList.remove('normal', 'attention');
value.classList.add('attention');
break;
case bmi >= 18.5 && bmi <= 25:
description = 'Você está no peso ideal!';
value.classList.remove('attention');
value.classList.add('normal');
break;
case bmi >
25 && bmi <= 30:
description = 'Cuidado! Você está com sobrepeso!';
value.classList.remove('normal');
value.classList.add('attention');
break;
case bmi > 30 && bmi <= 35:
description = 'Cuidado! Você está com obesidade moderada!';
break;
case bmi > 35 && bmi <= 40:
description = 'Cuidado! Você está com obesidade severa!';
break;
case bmi > 40:
description = 'Cuidado! Você está com obesidade mórbida!';
break;
default:
description = 'Verifique os valores informados.';
break;
}✅ 正确解法二:改用 if-else if-else 链(推荐初学者)
语义更直观,调试友好,且无任何隐式转换风险,是处理范围判断的首选模式:
if (bmi < 18.5) {
description = 'Cuidado! Você está abaixo do peso!';
value.classList.add('attention').remove('normal');
} else if (bmi <= 25) {
description = 'Você está no peso ideal!';
value.classList.add('normal').remove('attention');
} else if (bmi <= 30) {
description = 'Cuidado! Você está com sobrepeso!';
value.classList.add('attention').remove('normal');
} else if (bmi <= 35) {
description = 'Cuidado! Você está com obesidade moderada!';
} else if (bmi <= 40) {
description = 'Cuidado! Você está com obesidade severa!';
} else {
description = 'Cuidado! Você está com obesidade mórbida!';
}⚠️ 额外注意事项:
const weight = parseFloat(document.querySelector('#weight').value);
const height = parseFloat(document.querySelector('#height').value);
if (isNaN(weight) || isNaN(height) || height <= 0) {
alert('Por favor, insira valores válidos para peso e altura.');
return;
}总结:switch 不适用于范围判断,但 switch(true) 是合法且有效的变通技巧;而 if-else 链则是语义最清晰、可读性最高、兼容性最好的标准实践。选择哪种方案,取决于团队规范与可维护性优先级。