从 switch 语句返回是否被视为比使用 break 更好的做法?[已关闭]

2022-08-30 00:26:50

选项 1 - 使用回车进行切换

function myFunction(opt) {
  switch (opt) {
    case 1: return "One";
    case 2: return "Two";
    case 3: return "Three";

    default: return "";
  }    
}

选项 2 - 使用断路器进行切换

function myFunction(opt) {
  let retVal = "";

  switch (opt) {
    case 1: 
      retVal = "One";
      break;
    case 2: 
      retVal = "Two";
      break;
    case 3: 
      retVal = "Three";
      break;
  }

  return retVal;
}

我知道两者都有效,但还有一种最佳实践吗?我倾向于喜欢选项1 - 使用最佳,因为它更干净,更简单。switchreturn


以下是我使用@ic3b3rg评论中提到的技术的特定示例的jsFiddle

let SFAIC = {};

SFAIC.common = {
  masterPages: {
    cs: "CS_",
    cp: "CP_"
  },
  contentPages: {
    cs: "CSContent_",
    cp: "CPContent_"    
  }
};

function getElementPrefix(page) {
  return (page in SFAIC.common.masterPages)
    ? SFAIC.common.masterPages[page]
    : (page in SFAIC.common.contentPages)
      ? SFAIC.common.contentPages[page]
      : undefined;
}

要调用该函数,我将通过以下方式执行此操作:

getElementPrefix(SFAIC.common.masterPages.cs);
getElementPrefix(SFAIC.common.masterPages.cp);
getElementPrefix(SFAIC.common.contentPages.cs);
getElementPrefix(SFAIC.common.contentPages.cp);

这里的问题是它总是返回未定义。我猜这是因为它传入了对象文本的实际值,而不是属性。我该怎么做才能使用@ic3b3rg的评论中描述的技术来解决此问题?


答案 1

中断将允许您继续在函数中进行处理。只需从开关中返回即可,如果这是您要在函数中执行的所有操作。


答案 2

两者都不是,因为对于一个非常简单的任务来说,两者都相当冗长。你可以做:

const result = ({
  1: 'One',
  2: 'Two',
  3: 'Three'
})[opt] ?? 'Default'    // opt can be 1, 2, 3 or anything (default)

当然,这也适用于字符串,两者的混合或不带默认大小写:

const result = ({
  'first': 'One',
  'second': 'Two',
  3: 'Three'
})[opt]                // opt can be 'first', 'second' or 3

解释:

它的工作原理是创建一个对象,其中选项/案例是键,结果是值。通过将选项放入括号中,您可以通过括号表示法访问与表达式匹配的键的值。

如果括号内的表达式不是有效的键,则返回。我们可以通过使用 nullish 合并运算符 ?? 来检测这种未定义的情况,并返回默认值。undefined

例:

console.log('Using a valid case:', ({
  1: 'One',
  2: 'Two',
  3: 'Three'
})[1] ?? 'Default')

console.log('Using an invalid case/defaulting:', ({
  1: 'One',
  2: 'Two',
  3: 'Three'
})[7] ?? 'Default')
.as-console-wrapper {max-height: 100% !important;top: 0;}