在JavaScript中,返回switch语句是否比使用break更好?


198

选项1-使用return切换:

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

        default: return "";
    }    
}

选项2-使用中断进行切换:

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-切换收益率最好,因为它更干净,更简单。


这是我的特定示例的jsFiddle,使用@ ic3b3rg的注释中提到的技术

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注释中描述的技术来解决此问题?


4
+1好问题。我自己对此感到纳闷,虽然我知道它可以正常工作,但我不知道这是否是最佳实践。好奇地看到社区的想法。
伊莱(Eli)

Answers:


266

休息一下将使您可以继续执行该功能。如果您只想在函数中执行所有操作,则只需退出开关即可。


6
因此,考虑到我的问题中的示例,答案是肯定的。但是,如果您有需要继续使用的功能,显然可以使用中断。
Code Maverick

9
@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]:"");
ic3b3rg

我不是在使用您的示例,而只是在使用技术。查看我的问题,然后单击指向我的jsFiddle的链接以查看我在说什么。
Code Maverick

9

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

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

var foo = "bar";

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

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

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


2
该示例中的最佳做法是return foo == "bar";
ic3b3rg,2011年

10
如果您要烦我,我深表歉意,但在那种情况下,我还是会简化:return foo == "bar" ? 0 : 100;甚至return [100,0][foo == "bar"];
ic3b3rg,2011年

4
@ ic3b3rg-不是 return [100,0][+(foo == "bar")]; 吗?
排队

3
@Queue您是正确的,因为布尔值应该转换为整数,但是我可以这样:return [100,0][foo == "bar" & 1];
ic3b3rg 2013年

7
@ ic3b3rg && Queue-您想如何使用这些技巧来维护别人的代码?(请信任预编译器以加快诸如此类的速度)
T4NK3R
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.