从switch语句中返回比使用break更好吗?

选项1 - switch使用return:

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


default: return "";
}
}

选项2 - switch使用break:

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的注释中描述的技术来修复这个问题?

197213 次浏览

暂停将允许您继续在函数中处理。如果你想在函数中做的只是从switch中返回就可以了。

这要看情况,如果你的函数只包含switch语句,那么我认为没问题。然而,如果你想在这个函数中执行任何其他操作,这可能不是一个好主意。您还可能需要考虑您现在和将来的需求。如果您希望将函数从选项一更改为选项二,则需要进行更多的重构。

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

var foo = "bar";


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

基于此,可以认为选择一是更好的做法。

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

都不是,因为对于一个非常简单的任务来说,这两个都太啰嗦了。你可以这样做:

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

解释:

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

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