为什么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
相关产品推荐
相关产品推荐

