从switch语句中返回被认为是比使用break更好的做法

Is returning out of a switch statement considered a better practice than using break?

本文关键字:break 更好 语句 switch 返回 认为是      更新时间:2023-09-26

选项1-使用return:switch

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

选项2-使用breakswitch

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-switch使用return,因为它更干净、更简单。


以下是我使用@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);

这里的问题是它总是返回undefined。我猜这是因为它传递的是对象文字的实际值,而不是属性。使用@ic3b3rg的注释中描述的技术,我该如何解决此问题?

中断将允许您继续处理函数。如果这就是你在函数中想要做的全部,那么从开关中返回就可以了。

两者都不是,因为对于一个非常简单的任务来说,两者都非常冗长您可以执行以下操作:

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

当然,这也适用于字符串,两者的混合或没有默认情况:

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

说明:

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

如果括号内的表达式不是有效键,则返回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;}

这取决于,如果您的函数只由switch语句组成,那么我认为这很好。然而,如果您想在该函数中执行任何其他操作,这可能不是一个好主意。您可能还需要考虑您现在和将来的需求。如果您想将函数从选项一更改为选项二,则需要进行更多的重构。

然而,考虑到在if/else语句中,最好执行以下操作:

var foo = "bar";
if(foo == "bar") {
    return 0;
}
else {
    return 100;
}

基于此,可以提出选择一是更好的做法的论点。

简而言之,没有明确的答案,所以只要您的代码遵循一致、可读、可维护的标准——也就是说,不要在整个应用程序中混合和匹配选项一和选项二,这就是您应该遵循的最佳实践。