В JavaScript считается ли возврат из оператора switch лучшей практикой, чем использование break?

199

Вариант 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 - лучше использовать возврат, так как он чище и проще.


Вот 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 Хороший вопрос. Я сам удивлялся этому, и хотя я знаю, что это работает просто вернуться, я не знаю, будет ли это наилучшей практикой. Любопытно посмотреть, что думает сообщество.
Илай

Ответы:

267

Перерыв позволит вам продолжить обработку в функции. Просто вернуться из переключателя - это нормально, если это все, что вы хотите сделать в функции.

ic3b3rg
источник
6
Итак, учитывая пример в моем вопросе, ответ - да. Но если у вас есть функция, в которой вам нужно продолжать работу, очевидно, что вы будете использовать разрыв.
Код 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] : "";, но в моем конкретном случае он всегда возвращает значение по умолчанию.
Код Maverick
В моем коде была опечатка (отсутствует 2-й "в "Two"), но она работает для меня ... вот простой тест:var o={1:"One",2:"Two",3:"Three"},opt=2; alert(opt in o?o[opt]:"");
ic3b3rg
Я не использовал твой пример, только технику. Посмотрите на мой вопрос и нажмите ссылку на мой jsFiddle, чтобы увидеть, о чем я говорю.
Код Maverick
9

Это зависит, если ваша функция состоит только из оператора switch, то я думаю, что это нормально. Однако, если вы хотите выполнить какие-либо другие операции внутри этой функции, это, вероятно, не очень хорошая идея. Вам также, возможно, придется рассмотреть ваши требования прямо сейчас, а не в будущем. Если вы хотите изменить свою функцию с первого варианта на второй, потребуется больше рефакторинга.

Однако, учитывая, что в операторах if / else лучше всего делать следующее:

var foo = "bar";

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

Исходя из этого, можно утверждать, что первый вариант - лучшая практика.

Короче говоря, нет однозначного ответа, поэтому, пока ваш код придерживается согласованного, читабельного, поддерживаемого стандарта, то есть не смешивайте и не сочетайте варианты один и два в вашем приложении, это лучшая практика, которой вы должны руководствоваться. следующий.

Марк Костелло
источник
2
Лучшая практика в этом примереreturn foo == "bar";
ic3b3rg
10
Я прошу прощения, если я вас раздражаю, но в этом случае я все еще упростил бы: return foo == "bar" ? 0 : 100;или даже return [100,0][foo == "bar"];.
ic3b3rg
4
@ ic3b3rg - Это не должно быть: return [100,0][+(foo == "bar")]; ?
Очередь
3
@Queue Вы правы в том, что логическое значение должно быть преобразовано в целое число, но я бы сделал это следующим образом:return [100,0][foo == "bar" & 1];
ic3b3rg
7
@ ic3b3rg && Очередь - Как бы вы хотели, чтобы кто-то использовал другой код, используя такие приемы? (Доверьтесь прекомпилятору, чтобы оптимизировать скорость, как это)
T4NK3R