Как получить возвращаемое значение из оператора 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;
}
Если вам нужны нестрочные случаи, вы можете использовать карту.