【问题标题】:Is returning out of a switch statement considered a better practice than using break? [closed]从 switch 语句中返回是否被认为是比使用 break 更好的做法? [关闭]
【发布时间】:2011-09-01 03:14:39
【问题描述】:

选项 1 - 使用 return 切换:

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

        default: return "";
    }    
}

选项 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;
}

我知道这两种方法都有效,但还有一种最佳做法吗?我倾向于选择选项 1 - 最好使用 return 进行切换,因为它更干净、更简单。


Here is a jsFiddle of my specific example using the technique mentioned in @ic3b3rg's comments

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;
}

要调用该函数,我会通过以下方式进行:

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

这里的问题是它总是返回未定义的。我猜这是因为它传递的是对象文字的实际值而不是属性。我将如何使用 @ic3b3rg 的 cmets 中描述的技术来解决此问题?

【问题讨论】:

    标签: javascript return switch-statement break


    【解决方案1】:

    中断将允许您继续在函数中处理。如果您只想在函数中执行此操作,只需退出开关即可。

    【讨论】:

    • 因此,鉴于我的问题中的示例,答案是肯定的。但是,如果你有一个需要继续执行的函数,那么显然你会使用一个 break。
    • @Mark Costello 的回答让我更加感谢您的问题。我认为您正在寻找一般的“最佳实践”指南,但在您给出的具体示例中,最佳实践是return {1:"One",2:"Two,3:"Three"}[opt];。如果您需要默认值,那么它将是 var o={1:"One",2:"Two,3:"Three"}; return opt in o?o[opt]:"";
    • @ic3b3rg - 我已经用我的具体示例编辑了我的问题,试图利用您的return (opt in o) ? o[opt] : ""; 技术,但在我的具体情况下它总是返回默认值。
    • 我的代码中有一个错字(在"Two" 中缺少第二个")但它对我有用...这是一个简单的测试:var o={1:"One",2:"Two",3:"Three"},opt=2; alert(opt in o?o[opt]:"");
    • 我没有用你的例子,只是技术。查看我的问题并单击指向我的 jsFiddle 的链接以查看我在说什么。
    【解决方案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
    

    解释:

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

    如果括号内的表达式不是有效的键,则返回undefined。我们可以使用nullish coalescing operator ?? 检测这种未定义的情况并返回一个默认值。

    示例:

    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;}

    【讨论】:

    • 这个方法叫什么?
    • @SouravSingh 我认为它没有名字。当我对这里的解决方案不满意时,我只是想出了它。我想我会称之为“对象切换”
    【解决方案3】:

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

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

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

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

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

    【讨论】:

    • 该示例中的最佳实践是return foo == "bar";
    • 如果我打扰了你,我很抱歉,但在这种情况下,我仍然会简化:return foo == "bar" ? 0 : 100; 甚至return [100,0][foo == "bar"];
    • @ic3b3rg - 不应该是:return [100,0][+(foo == "bar")]; 吗?
    • @Queue 你是正确的,布尔值应该转换为整数,但我会这样做:return [100,0][foo == "bar" & 1];
    • @ic3b3rg && Queue - 你想如何使用这些技巧来维护别人的代码? (相信预编译器会加速优化类似的东西)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-25
    • 1970-01-01
    • 2010-09-26
    相关资源
    最近更新 更多