web-dev-qa-db-ja.com

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

オプション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つのベストプラクティスですか?私はオプション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のコメントで説明されている手法を使用してこれを修正するにはどうすればよいですか?

175
Code Maverick

ブレークを使用すると、関数で処理を続行できます。関数でやりたいことがあれば、スイッチから戻るだけで十分です。

224
ic3b3rg

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

ただし、if/elseステートメント内で次のことを行うことをお勧めします。

var foo = "bar";

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

これに基づいて、オプション1の方がより良い実践であるという議論をすることができます。

要するに、あなたのコードが一貫性​​があり、読み取り可能で、保守可能な標準に準拠している限り、明確な答えはありません-つまり、アプリケーション全体でオプション1と2を組み合わせて一致させないでください。以下。

8
Mark Costello