防止 switch 穿透的核心是让每个 case 显式终结:函数内优先 return,非函数用 break,非法值 throw 报错;空 case 也写 break;用 eslint no-fallthrough 规则自动检查;有意穿透需语义一致、紧邻排列;优先用对象映射或 map 替代。

防止 switch 穿透的核心是让每个 case 有明确的执行终点,而不是依赖“记得加 break”这种易出错的习惯。
每个 case 必须显式终结
把每个 case 当作一个独立分支来对待,强制自己写终止语句:
- 在函数体内,优先用 return ——简洁、天然阻断穿透,还能提前退出
- 非函数作用域或需继续执行后续逻辑时,统一用 break
- 遇到非法值,可用 throw new Error() 终止并报错,比静默穿透更安全
- 哪怕 case 暂时空着,也写上 break,不留空白缺口
用 ESLint 自动拦截遗漏
人工检查容易漏,交给工具更可靠:
- 启用 ESLint 的 no-fallthrough 规则,设为 error 级别
- 它默认允许带注释的穿透,比如写 // falls through 表示有意为之
- VS Code 配合 ESLint 插件,保存即提示,问题不过夜
该用穿透时,要写得清晰可控
穿透不是错误,而是特性——但必须满足两个条件:多个 case 值语义相同,且共享逻辑紧邻、无中间干扰:
- case 连续排列,缩进对齐,视觉上形成自然分组
- 只在最后一项后加 break 或 return,前面全空行
- 避免跨语义穿透,比如把 'pending' 和 'error' 放一起执行清理逻辑,容易掩盖问题
- 不推荐用穿透做“复用”,真正需要复用的代码应抽成函数
考虑替代方案:对象映射或 Map
当 switch 只干一件事:根据某个值返回结果、调用函数、设置状态,就不用 switch:
- 用纯对象字面量:const handler = { a: fnA, b: fnB };,然后 handler[val]?.()
- 或用 Map 存储动态键值对,支持任意类型 key
- 彻底绕过 break 管理,结构扁平,增删改查都直观
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











