In JavaScript, il ritorno da un'istruzione switch è considerato una pratica migliore rispetto all'utilizzo di break?


198

Opzione 1 - cambia usando return:

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

        default: return "";
    }    
}

Opzione 2: passare usando l'interruzione:

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

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

        case 2: 
            retVal = "Two";
            break;

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

    return retVal;
}

So che funzionano entrambi, ma è un'altra delle migliori pratiche? Tendo a gradire l'opzione 1: passare usando return best, in quanto è più semplice e pulito.


Ecco un jsFiddle del mio esempio specifico usando la tecnica menzionata nei commenti di @ 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;
}

Per chiamare la funzione, lo farei nei seguenti modi:

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

Il problema qui è che restituisce sempre indefinito. Immagino che sia perché passa nel valore reale dell'oggetto letterale e non nella proprietà. Cosa farei per risolvere questo problema usando la tecnica descritta nei commenti di @ ic3b3rg ?


4
+1 Buona domanda. Me lo sono chiesto da solo, e mentre so che funziona per tornare, non so se sia la migliore pratica. Curioso di vedere cosa pensa la comunità.
Eli,

Risposte:


266

Un'interruzione ti consentirà di continuare l'elaborazione nella funzione. Il solo ritorno dall'interruttore va bene se questo è tutto ciò che vuoi fare nella funzione.


6
Quindi, dato l'esempio nella mia domanda, la risposta è sì. Ma se hai una funzione in cui devi andare avanti, ovviamente una pausa sarebbe quella che useresti.
Codice Maverick,

9
La risposta di @Mark Costello mi ha fatto ringraziare un po 'di più per la tua domanda. Penso che tu stia cercando una linea guida generale sulle "migliori pratiche", ma nell'esempio specifico che hai fornito, la migliore pratica è return {1:"One",2:"Two,3:"Three"}[opt];. Se hai bisogno del valore predefinito, sarebbevar o={1:"One",2:"Two,3:"Three"}; return opt in o?o[opt]:"";
ic3b3rg

@ ic3b3rg - Ho modificato la mia domanda con il mio esempio specifico cercando di utilizzare la tua tecnica di return (opt in o) ? o[opt] : "";, ma restituisce sempre l'impostazione predefinita nel mio caso specifico.
Codice Maverick,

C'era un refuso nel mio codice (manca il 2 ° "in "Two") ma funziona per me ... ecco un semplice test:var o={1:"One",2:"Two",3:"Three"},opt=2; alert(opt in o?o[opt]:"");
ic3b3rg

Non stavo usando il tuo esempio, solo la tecnica. Guarda la mia domanda e fai clic sul collegamento al mio jsFiddle per vedere di cosa sto parlando.
Codice Maverick,

9

Dipende, se la tua funzione consiste solo nell'istruzione switch, allora penso che vada bene. Tuttavia, se si desidera eseguire altre operazioni all'interno di quella funzione, probabilmente non è una grande idea. Potrebbe anche essere necessario prendere in considerazione le vostre esigenze in questo momento rispetto al futuro. Se si desidera modificare la funzione dall'opzione 1 all'opzione due, saranno necessari ulteriori refactoring.

Tuttavia, dato che all'interno delle dichiarazioni if ​​/ else è consigliabile eseguire le seguenti operazioni:

var foo = "bar";

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

Sulla base di ciò, si potrebbe sostenere che l'opzione 1 è una pratica migliore.

In breve, non esiste una risposta chiara, quindi finché il codice aderisce a uno standard coerente, leggibile e mantenibile, vale a dire non mescolare e abbinare le opzioni una e due in tutta l'applicazione, questa è la migliore pratica che dovresti essere a seguire.


2
La migliore pratica in questo esempio èreturn foo == "bar";
ic3b3rg

10
Mi scuso se ti disturbo, ma in tal caso semplificherei ancora: return foo == "bar" ? 0 : 100;o anche return [100,0][foo == "bar"];.
ic3b3rg,

4
@ ic3b3rg - Non dovrebbe essere che: return [100,0][+(foo == "bar")]; ?
Coda

3
@Queue Hai ragione nel dire che il booleano dovrebbe essere convertito in intero, ma lo farei in questo modo:return [100,0][foo == "bar" & 1];
ic3b3rg

7
@ ic3b3rg && Queue - Come ti piacerebbe mantenere il codice di qualcun altro usando questi trucchi? (Affidati al precompilatore per ottimizzare le cose in modo simile)
T4NK3R
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.