javascript switch case仅支持严格相等(===)匹配,不支持表达式;但可通过switch(true)技巧实现条件分支,每个case后跟布尔表达式,按顺序执行首个为true的分支并需break防穿透。

JavaScript 中 switch case 本身不直接支持“表达式匹配”(比如 case x > 5),它只做严格相等(===)比较。但你可以通过把 switch(true) 作为技巧,让每个 case 后跟一个布尔表达式,从而实现逻辑上的“条件分支”,达到精准匹配效果。
switch(true) 是核心技巧
把 switch 的判断目标设为 true,然后每个 case 写一个返回布尔值的表达式。只要该表达式结果为 true,就视为匹配成功。
- 表达式会在运行时求值,支持变量、函数调用、比较运算符(
>、、<code>===等) - 匹配顺序从上到下,第一个为
true的case执行,之后需用break阻止穿透 - 仍需
break,否则会继续执行后续case和default
示例:
let score = 76;switch (true) {
case score >= 90:
console.log('A'); break;
case score >= 80:
console.log('B'); break;
case score >= 70:
console.log('C'); break;
default:
console.log('F');
}
匹配时用的是严格相等,不是类型转换
无论你写 switch(score) 还是 switch(true),内部始终用 === 比较。这意味着:
-
case "5":不会匹配数字5 -
case []:永远不会命中,因为[] === []是false -
case NaN:永远不触发,因为NaN === NaN为false
所以不要在 case 后写变量或对象字面量——它们不是可复用的常量值,也不满足严格相等语义。
case 值必须是静态常量(常规用法)
如果你不用 switch(true) 技巧,而是直接 switch(变量),那每个 case 后只能跟字面量常量:
- 支持:数字(
1、-3.14)、字符串("ok")、布尔(true)、null、undefined、Symbol - 不支持:
case x + 1:、case SOME_CONST * 2:、case getValue(): - 所有
case值必须互不相同,否则只有第一个生效
default 不是必须放最后,但建议保持习惯
default 可以出现在任意位置,引擎会把它当作“未匹配时的兜底”,不依赖顺序。不过为可读性考虑,绝大多数场景都放在末尾。
示例(合法但不推荐):
switch (day) {default:
console.log('未知日期');
case 1:
console.log('周一'); break;
case 2:
console.log('周二'); break;
}
这样写虽然能运行,但容易让人误以为 default 是“默认执行”,实际它只在无匹配时触发——和位置无关。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











