优化Switch代码实现DRY:能否将personsName赋值移出Case分支?
关于switch分支赋值冗余的解决方案
嗨,这个想法挺棒的——想减少重复代码肯定是好习惯,但直接像你说的那样写case "Bob": "Bob almighty"; break;是行不通的,我来给你掰扯清楚为啥,再给你几个能达到类似效果的方案~
为什么直接写字符串字面量不行?
JavaScript 里的 switch 分支代码块需要是可执行的语句,单纯的字符串字面量(比如 "Bob almighty")没有任何执行逻辑,JS 引擎完全不知道要把这个值赋值给 personsName。这么写要么会触发语法错误,要么就算没报错,也完全达不到你想要的赋值效果,相当于这段代码是无效的。
替代方案:消除冗余的几种写法
1. 对象映射(最推荐,适合多case场景)
当你有50个case的时候,用对象键值对来映射是最简洁易维护的方式,完全避免重复的赋值语句:
const nameMap = { "John": "little John", "Bob": "Bob almighty", // 这里继续添加剩下的48组映射关系 }; let name; // 假设这里会被赋值 const personsName = nameMap[name] || "默认名称"; // 可以添加默认值处理
后续要新增或修改映射,直接在nameMap里操作就行,比维护一大段switch清爽太多。
2. IIFE包裹switch(保留switch结构的简洁写法)
如果你一定要保留switch的结构,可以用立即执行函数(IIFE)把每个case的返回值统一赋值给personsName:
let name; // 假设这里会被赋值 const personsName = (() => { switch (name) { case "John": return "little John"; case "Bob": return "Bob almighty"; // 继续添加其他case default: return "默认名称"; } })();
每个case里只需要return对应的值,不需要重复写赋值语句,逻辑也很清晰。
3. 临时变量中转(妥协方案)
如果因为某些原因必须用传统switch结构,也可以用一个临时变量来减少重复:
let name; // 假设这里会被赋值 let tempName; switch (name) { case "John": tempName = "little John"; break; case "Bob": tempName = "Bob almighty"; break; // 继续添加其他case default: tempName = "默认名称"; } const personsName = tempName;
不过这种写法还是有重复的tempName =,只是把重复的变量名缩短了,优先级不如前两种方案。
内容的提问来源于stack exchange,提问作者lovemyjob
相关产品推荐
相关产品推荐

