JS卡牌计数用switch替代if else时为何无需额外添加return
JavaScript卡牌计数实现:switch语句中为什么加return会报错?
首先搞清楚最基础的规则:函数内只要执行到return关键字,会立刻终止整个函数的运行,直接返回return后面的值,后续所有未执行的代码都会被跳过。
你这次提交报错的核心原因,从来不是「switch语句里不能写return」,而是你return的时机、return的内容都不符合你当前代码的结构逻辑:
- 你当前写的switch版本,结构是拆成两步走的:
- 第一步:在switch块里根据传入的card值,对应修改count变量的数值,改完用
break跳出switch块就行——break只会跳出当前的switch结构,不会终止整个函数,后面的代码还能正常跑 - 第二步:switch执行完之后,统一走下面的if/else判断,根据count的正负拼接要求的返回格式「计数值 + Bet/Hold」,最后把拼好的字符串return出去
- 第一步:在switch块里根据传入的card值,对应修改count变量的数值,改完用
- 你在处理10/J/Q/K/A的case分支里直接写了
return count--;,代码跑到这行的时候会直接终止函数,把count的当前值(注意后置--是先返回原值、再对变量做递减,这里返回值本身就算数也不对)直接抛出去,后面拼接Bet/Hold的逻辑根本不会执行,返回的格式完全不符合题目要求,当然会判错。
至于你看到if else版本里写了return,本质是两种写法的代码结构不一样,不是if else有什么特殊权限。你看到的if else版本,是把「修改count值」「判断count正负拼接结果」两步全塞到了每个if分支里,每个分支最后直接返回拼好的完整结果字符串,这种结构下当然可以在分支里写return,举个典型的if else实现结构你就懂了:
let count = 0; function cc(card) { if (card >=2 && card <=6) { count++; // 这里return的是拼好的最终结果,不是半路返回裸的count值 return count > 0 ? `${count} Bet` : `${count} Hold`; } else if (card === 10 || card === "J" || card === "Q" || card === "K" || card === "A") { count--; // 同样是拼完最终要求的格式才return return count > 0 ? `${count} Bet` : `${count} Hold`; } else { // 7/8/9分支不修改count,直接拼结果返回 return count > 0 ? `${count} Bet` : `${count} Hold`; } }
说白了,return能不能写、写在哪,只和你代码的执行流程有关,和你用switch还是if else没有半毛钱关系。如果你愿意,完全可以把每个case里都写上完整的count修改+结果拼接逻辑,最后在case里直接return拼好的字符串,这种写法连break都不用写——毕竟return直接终止函数了,break根本轮不到执行。
顺便提一句你贴的代码里的小问题:7/8/9对应的case分支里写的count;是完全无效的冗余语句,这行代码啥操作都没做,留着没意义删掉就行。给你一个修正后可正常运行的switch版本参考:
let count = 0; function cc(card) { switch (card){ case 2: case 3: case 4: case 5: case 6: count++; break; case 7: case 8: case 9: // 7/8/9不修改count值,直接跳出switch即可 break; case 10: case "J": case "Q": case "K": case "A": count--; break; } // 所有分支修改完count后,统一判断返回结果 return count > 0 ? `${count} Bet` : `${count} Hold`; }
内容的提问来源于stack exchange,提问作者Juan Yeremia
相关产品推荐
相关产品推荐

