Как получить возвращаемое значение из оператора switch?

В хром-консоли, когда я печатаю:

> switch(3){default:"OK"}
  "OK"

Так выглядит, как оператор switch имеет возвращаемое значение. Но когда я сделаю:

> var a = switch(3){default:"OK"}

Он генерирует синтаксическую ошибку "Неожиданный переключатель токена",

Можно ли записать оператор возврата коммутатора?

Ответ 1

Это потому, что, когда вы помещаете это в консоль Chrome, вы коротко замыкаете его. Он просто печатает "ОК", потому что он достигает случая по умолчанию, а не возвращает что-то.

Если вы хотите что-то вернуть, вставьте его в функцию и верните "ОК" из стандартного случая.

function switchResult(a){
    switch(a){
        default: 
            return "OK";
    }
}

var a = switchResult(3);

Ответ 2

Возможно, интересно отметить, что вам не нужен беспорядок ;break; если вы завернете его в функцию. (как описано heloandre)

function switchResult(a){   
    switch(a){   
        case 1: return "FOO";
        case 2: return "BAR";
        case 3: return "FOOBAR";
        default: return "OK";      
    }
}
var a = switchResult(3);

Ответ 3

ES6 позволяет вам сделать это с помощью немедленной лямбды:

const a = (() => {
  switch(3) {
    default: return "OK";
  }
})();

Ответ 4

Нет, у switch нет возвращаемого значения. То, что вы видите на консоли, - это возвращаемое значение оператора внутри switch содержащего только строковое литераловое значение.

Оператор может иметь возвращаемое значение. Например, присваивание имеет назначенное значение в качестве возвращаемого значения, а пост-приращение значения возвращает результат после приращения:

> a = 42;
42
> a++;
43

Оператор, содержащий только значение, будет иметь это значение как возвращаемое значение:

> 42;
42
> "OK";
"OK"

Однако такой оператор полезен только в консоли, например, для отображения значения переменной. В коде он ничего не добьется.

Ответ 5

Недавно мне пришлось проверить, могут ли инструкции switch возвращать значения. Я был уверен, что они могут и быстро выполнили быструю функцию, чтобы протестировать его на консоли FF и Chrome.

function switchController(setFlag) {
  switch (setFlag) {
    case true:   return setFlag;
    case false:  return setFlag;
  }
}

console.log(switchController(true));
console.log(switchController(false));

Вы должны получить вывод в консоли:

true
false

Вы можете просмотреть возвращаемые значения с помощью console.log()

Ответ 6

Chrome просто показывает вам последнее оцениваемое значение. Нет выхода от switch. Просто используйте переменную.

var a; 

switch(3)
{
  default:
    a = "OK";
}

Ответ 7

В инструментах chrome dev вы видите значение завершения оператора switch. В основном значение последнего оцененного выражения (но не совсем, например, значение завершения var a = 42 не равно 42). Значение завершения - это конструкция в ECAMScript, которая обычно скрыта от программиста. Тем не менее, это также подходит как возвращаемое значение eval().

Грамматика для присваивания переменных ожидает выражение в правой части, поэтому при использовании оператора switch это место является синтаксической ошибкой:

"var" <name> "=" <expression> 

По сути, разница между операторами и выражениями заключается в том, что выражения вычисляют значение, а операторы - нет. Вызовы функций, арифметика и литералы - все это выражения, например. "If" и "switch" не являются утверждениями.

Нет никакого способа получить значение завершения любого оператора, который, возможно, ожидает его завершение в вызов eval:

var a = eval('switch (3) { default: "OK" }')
console.log(a) // => "OK"

Но использование eval для этого не будет хорошей идеей.

К сожалению, нет хорошего способа архивировать то, что вы хотите сделать. Как и в других упомянутых ответах, вы можете заключить переключатель в функцию (или IIFE) и использовать операторы return для получения значения:

const a = (() => {
  switch(3) { default: return "OK"; }
})();

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

Насколько я понимаю, это является одним из мотивов предложения ECAMScript для сопоставления с образцом. Но предложение находится на этапе 1 и еще не готово к использованию.

Кроме того, вы можете захотеть написать свой код так, чтобы вообще не требовались операторы switch. Некоторое время назад я наткнулся на следующий шаблон, который, по-видимому, распространен в Lua, но я никогда не видел его в JavaScript:

Вместо использования оператора switch вы можете поместить все свои случаи в качестве свойств в объект JavaScript и использовать функции в качестве значений вместо логики в отдельных блоках case. Это может выглядеть примерно так:

const cases = {
  "FOO": () => 1,
  "BAR": () => 2,
  "BAR": () => 3,
};


const value = "FOO";
const result = cases[value]();
console.log(result); // => 1

Вместо этого:

let result;
switch (value) {
    case "FOO":
        result = 1;
        break;
    case "BAR":
        result = 2;
        break;
    case "BAR":
        result = 3;
        break;
}

Если вам нужны нестрочные случаи, вы можете использовать карту.