You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为什么JavaScript switch case穿透时default分支也会被执行?

代码执行逻辑逐行拆解

你的代码完整运行流程如下:

  • 初始化阶段:声明变量time并赋值为21,声明变量text,初始值为undefined
  • 进入switch判断逻辑:将time的取值与所有case后的值做严格相等比较(===)
  • 成功匹配到case 21分支,开始执行该分支下的代码:text = "1st case"
  • 由于该分支没有写break语句,触发switch默认的穿透(fall through)机制:不会主动跳出switch结构,直接按顺序执行后续所有分支的代码,不会再校验后续case的条件是否匹配:
    • 执行case 22分支代码:text = "2nd case"
    • 继续穿透执行case 23分支代码:text = "3rd case"
    • 继续穿透执行default分支代码:text = "default"
  • switch所有分支执行完毕后退出结构,执行console.log(text),最终输出结果为default

穿透规则的底层原理

JavaScript的switch语法继承自C语言,默认设计为穿透机制,核心逻辑是:

  • switch匹配到第一个符合条件的case后,仅标记代码执行的起始位置,不会自动插入终止逻辑
  • 只有遇到break、return、throw这类可以中断执行流的关键字时,才会提前跳出switch结构
  • 这个特性本身是为了简化多条件共用分支的开发场景,比如你需要多个case走同一段逻辑时,可以直接利用穿透避免重复代码:
var time = 21
var text;
switch (time) {
  case 21:
  case 22:
  case 23:
    text = "夜间时段";
    break;
  default:
    text = "其他时段";
}
// 此时time匹配到case21后穿透执行到赋值逻辑,遇到break跳出,最终text为"夜间时段"

你刻意去掉break的写法就相当于主动利用了穿透特性,让代码从匹配到的第一个分支开始顺次执行到整个switch结束。

内容的提问来源于stack exchange,提问作者Soham Verma

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 01:00:05