En JavaScript, ¿regresar de una declaración de cambio se considera una mejor práctica que usar break?

198

Opción 1 - cambiar usando retorno:

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

        default: return "";
    }    
}

Opción 2 - cambiar usando 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;
}

Sé que ambos funcionan, pero ¿es una de las mejores prácticas? Me gusta la opción 1: cambiar usando return mejor, ya que es más limpio y simple.


Aquí hay un jsFiddle de mi ejemplo específico usando la técnica mencionada en los comentarios de @ 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;
}

Para llamar a la función, lo haría de las siguientes maneras:

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

El problema aquí es que siempre regresa indefinido. Supongo que es porque está pasando el valor real del objeto literal y no la propiedad. ¿Qué haría para arreglar esto usando la técnica descrita en los comentarios de @ ic3b3rg ?

Code Maverick
fuente
44
+1 Buena pregunta. Me lo he preguntado yo mismo, y aunque sé que funciona simplemente regresar, no sé si es la mejor práctica. Curioso por ver lo que piensa la comunidad.
Eli

Respuestas:

266

Un descanso le permitirá continuar procesando en la función. Simplemente regresar del interruptor está bien si eso es todo lo que quieres hacer en la función.

ic3b3rg
fuente
66
Entonces, dado el ejemplo en mi pregunta, la respuesta es sí. Pero, si tiene una función en la que necesita continuar, obviamente lo que usaría sería un descanso.
Código Maverick
9
La respuesta de @Mark Costello me hizo agradecer un poco más sobre su pregunta. Creo que está buscando una guía general de "mejores prácticas", pero en el ejemplo específico que dio, la mejor práctica es return {1:"One",2:"Two,3:"Three"}[opt];. Si necesita el valor predeterminado, entonces seríavar o={1:"One",2:"Two,3:"Three"}; return opt in o?o[opt]:"";
ic3b3rg
@ ic3b3rg: he editado mi pregunta con mi ejemplo específico tratando de utilizar su técnica de return (opt in o) ? o[opt] : "";, pero siempre devuelve el valor predeterminado en mi caso específico.
Code Maverick
Se cometió un error en mi código (falta el segundo "en "Two") pero funciona para mí ... he aquí una prueba sencilla:var o={1:"One",2:"Two",3:"Three"},opt=2; alert(opt in o?o[opt]:"");
ic3b3rg
No estaba usando tu ejemplo, solo la técnica. Mire mi pregunta y haga clic en el enlace a mi jsFiddle para ver de qué estoy hablando.
Código Maverick
9

Depende, si su función solo consiste en la declaración de cambio, entonces creo que está bien. Sin embargo, si desea realizar cualquier otra operación dentro de esa función, probablemente no sea una buena idea. También es posible que tenga que considerar sus requisitos en este momento en comparación con el futuro. Si desea cambiar su función de la opción uno a la opción dos, se necesitará una mayor refactorización.

Sin embargo, dado que dentro de las declaraciones if / else, es una buena práctica hacer lo siguiente:

var foo = "bar";

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

En base a esto, se podría argumentar que la opción uno es una mejor práctica.

En resumen, no hay una respuesta clara, por lo tanto, siempre y cuando su código se adhiera a un estándar coherente, legible y mantenible, es decir, no mezcle y combine las opciones uno y dos en su aplicación, esa es la mejor práctica que debe ser siguiendo.

Mark Costello
fuente
2
La mejor práctica en ese ejemplo esreturn foo == "bar";
ic3b3rg
10
Pido disculpas si te estoy molestando pero en ese caso aún simplificaría: return foo == "bar" ? 0 : 100;o incluso return [100,0][foo == "bar"];.
ic3b3rg
44
@ ic3b3rg - ¿No debería ser eso return [100,0][+(foo == "bar")]; ?
Cola
3
@Queue Tienes razón en que el booleano debe convertirse a entero, pero lo haría de esta manera:return [100,0][foo == "bar" & 1];
ic3b3rg
77
@ ic3b3rg && Queue - ¿Cómo le gustaría mantener el código de otra persona usando tales trucos? (Confíe en el precompilador para optimizar la velocidad de ese tipo de cosas)
T4NK3R