You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

优化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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:38:19