JavaScriptでは、switchステートメントから戻ることは、breakを使用するよりも良い方法と考えられていますか?


198

オプション1-リターンを使用して切り替える:

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つはベストプラクティスですか?私はオプション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;
}

この関数を呼び出すには、次のようにします。

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

ここでの問題は、それが常に未定義を返すことです。これは、プロパティではなくオブジェクトリテラルの実際の値を渡しているためだと思います。@ ic3b3rgのコメントに記載されている手法を使用してこれを修正するにはどうすればよいですか?


4
+1良い質問です。私はこれを自分で疑問に思っていましたが、戻るだけで機能することはわかっていますが、それがベストプラクティスであるかどうかはわかりません。コミュニティの考えを知りたい。
Eli

回答:


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

@ ic3b3rg-私はあなたのテクニックを利用しようとしている特定の例で私の質問を編集しましたreturn (opt in o) ? o[opt] : "";が、私の特定のケースでは常にデフォルトを返します。
Code Maverick

そこ(第二欠落している私のコードのタイプミスだった"では"Two")それは私のために動作します...ここで簡単なテストがあります:var o={1:"One",2:"Two",3:"Three"},opt=2; alert(opt in o?o[opt]:"");
ic3b3rg

私はあなたの例を使用していませんでした、テクニックだけを使用していました。私の質問を見て、jsFiddleへのリンクをクリックして、私が話していることを確認してください。
Code Maverick

9

場合によっては、関数がswitchステートメントのみで構成されている場合は問題ないと思います。ただし、その関数内で他の操作を実行したい場合、それはおそらく素晴らしいアイデアではありません。また、現在と将来の要件を考慮する必要がある場合もあります。関数をオプション1からオプション2に変更する場合は、さらにリファクタリングが必要になります。

ただし、if / elseステートメント内では、次のことを行うことがベストプラクティスです。

var foo = "bar";

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

これに基づいて、オプション1の方が優れているという主張をすることができます。

簡単に言うと、明確な答えはありません。コードが一貫性​​があり、読みやすく、保守可能な標準に準拠している限り、つまり、アプリケーション全体でオプション1と2を混在させたり一致させたりしないでください。それがベストプラクティスです。以下。


2
その例のベストプラクティスは、return foo == "bar";
ic3b3rgは、

10
私があなたを困らせているならお詫びしますが、その場合でも私はまだ単純化します:return foo == "bar" ? 0 : 100;またはreturn [100,0][foo == "bar"];
ic3b3rg

4
@ ic3b3rg-それはすべきではない: return [100,0][+(foo == "bar")];
2013年

3
:あなたブール値は整数に変換する必要がありますが、私はそれをこのようにしてくださいということです正しいで@Queuereturn [100,0][foo == "bar" & 1];
ic3b3rg

7
@ ic3b3rg && Queue-このようなトリックを使用して、他の誰かのコードをどのように維持しますか?(そのようなものをスピード最適化するためにプリコンパイラを信頼してください)
T4NK3R '29
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.