switch语句中case后独立代码的执行时机疑问——MurmurHash代码分析
关于MurmurHash中switch语句的疑问
我正在解读一段MurmurHash代码,遇到了如下代码片段:
switch (remainder) { case 3: k1 ^= (key.charCodeAt(i + 2) & 0xff) << 16; case 2: k1 ^= (key.charCodeAt(i + 1) & 0xff) << 8; case 1: k1 ^= (key.charCodeAt(i) & 0xff); // When is this executed? k1 = (((k1 & 0xffff) * c1) + ((((k1 >>> 16) * c1) & 0xffff) << 16)) & 0xffffffff; k1 = (k1 << 15) | (k1 >>> 17); k1 = (((k1 & 0xffff) * c2) + ((((k1 >>> 16) * c2) & 0xffff) << 16)) & 0xffffffff; h1 ^= k1; }
我从未见过switch语句中存在不属于case或default的代码,特此请教:最后一个case后的这段代码何时会执行?它是default语句的替代写法,还是会像写在switch块外一样始终执行?
解答
JavaScript的switch是标签式跳转结构,不是分支隔离的——只有遇到break、return或switch块结束时才会停止执行,否则会从匹配的case标签开始,依次往下执行所有后续语句(即"贯穿"特性)。
这段代码的执行规则如下:
- 当
remainder为3时:先执行case 3的赋值,因无break,继续执行case 2、case 1的赋值,最后执行case 1之后的哈希处理代码。 - 当
remainder为2时:执行case 2的赋值,贯穿到case 1的赋值,最后执行哈希处理代码。 - 当
remainder为1时:执行case 1的赋值后,直接执行哈希处理代码。 - 当
remainder为0或其他值时:没有匹配的case标签,也没有default分支,整个switch块内的代码都不会执行,包括那段哈希处理代码。
结论
这段代码不是default的替代写法,也不会始终执行——它仅在remainder为1、2、3时,作为case分支的公共收尾逻辑被执行,目的是利用switch的贯穿特性减少重复代码。如果remainder不匹配任何case,这段代码完全不会运行。
内容的提问来源于stack exchange,提问作者Ood
相关产品推荐
相关产品推荐

