为何JavaScript中switch的非默认最后case会执行?
无break的switch语句为何会执行后续分支?
你的代码示例:
const foo = figureOutWhatFooIs() console.log(foo) // 'bar' switch (foo) { case 'bar': console.log('foo = bar') case 'baz': console.log('foo = baz') }
当foo的值为'bar'时,case 'baz'的代码也会执行,核心原因是switch语句的默认贯穿(fall-through)特性:
- switch会从上到下匹配
case条件,找到第一个匹配的case后,会从该位置开始依次执行所有后续的case代码、甚至default代码,直到遇到break、return语句,或者整个switch代码块结束。 - 你这段代码里,
case 'bar'没有写break,所以执行完console.log('foo = bar')后,程序不会跳出switch,而是继续向下执行case 'baz'的代码,直到switch块结束。
如果想避免这种情况,只需在每个需要终止的case后添加break语句,同时建议加上default分支处理未匹配的情况:
const foo = figureOutWhatFooIs() console.log(foo) // 'bar' switch (foo) { case 'bar': console.log('foo = bar') break; // 终止贯穿,不再执行后续分支 case 'baz': console.log('foo = baz') break; default: console.log('foo 是其他值') break; }
当然,贯穿特性也可以被刻意利用——比如多个case需要执行相同逻辑时,可以省略中间case的break,此时建议添加注释说明意图,避免被误判为代码疏漏。
内容的提问来源于stack exchange,提问作者Aaron Parisi
相关产品推荐
相关产品推荐

