在JavaScript中,返回switch语句被认为是比使用break更好的做法吗?

Cod*_*ick 188 javascript return break switch-statement

选项1 - 使用return返回:

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

        default: return "";
    }    
}
Run Code Online (Sandbox Code Playgroud)

选项2 - 使用break切换:

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

    switch (opt) 
    {
        case 1: 
            retVal = "One";
            break;

        case 2: 
            retVal = "Two";
            break;

        case 3: 
            retVal = "Three";
            break;
    }

    return retVal;
}
Run Code Online (Sandbox Code Playgroud)

我知道两者都有效,但又是一种最佳实践吗?我倾向于喜欢选项1 - 使用返回最佳切换,因为它更干净,更简单.


这是我使用@ ic3b3rg评论中提到的技术的具体例子的jsFiddle:

var 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;
}
Run Code Online (Sandbox Code Playgroud)

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

getElementPrefix(SFAIC.common.masterPages.cs);
getElementPrefix(SFAIC.common.masterPages.cp);
getElementPrefix(SFAIC.common.contentPages.cs);
getElementPrefix(SFAIC.common.contentPages.cp);
Run Code Online (Sandbox Code Playgroud)

这里的问题是它总是返回undefined.我猜这是因为它传递的是对象文字的实际值,而不是属性.我将如何使用@ ic3b3rg的评论中描述的技术来解决这个问题?

ic3*_*3rg 242

中断将允许您继续处理该功能.如果您想在功能中完成所有操作,只需返回开关即可.

  • @Mark Costello的回答让我对你的问题有了更多的了解.我认为你正在寻找一般的"最佳实践"指南,但在你给出的具体例子中,最佳做法是"返回{1:"一",2:"二,三:"三"} [opt] ;`.如果你需要默认值,那么它将是`var o = {1:"One",2:"Two,3:"Three"}; 返回选择o?o [opt]:"";` (9认同)
  • 所以,鉴于我的问题中的例子,答案是肯定的.但是,如果你有一个你需要继续前进的功能,显然你会使用它. (6认同)

leo*_*ess 11

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

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

当然,这也适用于字符串,混合使用或不使用默认情况:

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

解释:

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

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

例子:

const result = ({
  1: 'One',
  2: 'Two',
  3: 'Three'
})[opt] ?? 'Default'    // opt can be 1, 2, 3 or anything (default)
Run Code Online (Sandbox Code Playgroud)
const result = ({
  'first': 'One',
  'second': 'Two',
  3: 'Three'
})[opt]                // opt can be 'first', 'second' or 3
Run Code Online (Sandbox Code Playgroud)

  • 如果您有任何逻辑或计算,此方法将导致每次都会评估每个选项。但是,通过将每个选项设置为函数而不是值(例如 `() => ' Three'`),您可以避免此问题:`({...options})[1]()`。或者,对于默认行为,`({...options})[1]?.() ?? ‘默认’`。如果某些选项可能返回 null 并且您不想覆盖它:`(({...options})[1] ?? (() => 'Default'))()`。 (3认同)
  • @SouravSingh 我认为它没有名字。老实说,当我对这里的解决方案不满意时,我才想出了它。我想我会称之为“对象切换” (2认同)

Mar*_*llo 8

这取决于,如果你的函数只包含switch语句,那么我认为它很好.但是,如果要在该函数中执行任何其他操作,可能不是一个好主意.您也可能需要立即考虑您的要求,而不是将来.如果要将功能从选项1更改为选项2,则需要进行更多重构.

但是,鉴于在if/else语句中,最佳做法是执行以下操作:

var foo = "bar";

if(foo == "bar") {
    return 0;
}
else {
    return 100;
}
Run Code Online (Sandbox Code Playgroud)

基于此,可以认为选项一是更好的实践.

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

  • 我很抱歉,如果我讨厌你,但在那种情况下,我仍然会简化:`return foo =="bar"?0:100;`或甚至`返回[100,0] [foo =="bar"];`. (9认同)
  • @ ic3b3rg && Queue - 你想用这些技巧维护别人的代码?(相信预编译器可以加速优化这样的东西) (7认同)
  • @ ic3b3rg - 不应该是:`return [100,0] [+(foo =="bar")];`? (4认同)
  • 该示例中的最佳实践是`return foo =="bar";` (2认同)
  • @Queue你是正确的,因为布尔值应该转换为整数,但我这样做:`return [100,0] [foo =="bar"&1];` (2认同)