在chrome的控制台中,当我输入:
> switch(3){default:"OK"}
"OK"
所以看起来switch语句有一个返回值。但是当我这样做时:
> var a = switch(3){default:"OK"}
抛出语法错误“Unexpected Token switch”
是否可以捕获交换机的return语句?
答案 0 :(得分:34)
那是因为当你将它放入Chrome控制台时,你就会将其短路。它只是打印'OK',因为它已达到默认情况,而不是实际上返回一些东西。
如果您想要返回某些内容,请将其粘贴在一个函数中,并在默认情况下返回“确定”。
function switchResult(a){
switch(a){
default:
return "OK";
}
}
var a = switchResult(3);
答案 1 :(得分:7)
或许有趣的是,如果将它包装在函数中,则不需要;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);
答案 2 :(得分:1)
不,switch
没有返回值。您在控制台中看到的是switch
内仅包含字符串文字值的语句的返回值。
语句可以有返回值。例如,赋值将赋值作为返回值,后递增值会在递增后返回结果:
> a = 42;
42
> a++;
43
仅包含值的语句将该值作为返回值:
> 42;
42
> "OK";
"OK"
这样的语句仅在控制台中有用,例如用于显示变量的值。在代码中它不会完成任何事情。
答案 3 :(得分:1)
ES6允许您执行此操作而无需定义其他功能:
const a = (() => {
switch(3) {
default: return "OK";
}
})();
答案 4 :(得分:0)
Chrome只是向您展示评估的最后一个值。 switch
没有输出。只需使用变量。
var a;
switch(3)
{
default:
a = "OK";
}
答案 5 :(得分:0)
我最近不得不测试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 :(得分:0)
您会在chrome开发工具中看到的是switch语句的completion value。基本上,最后一个计算表达式的值(但不完全相同,例如var a = 42
的完成值不是42)。完成值是ECAMScript中的一种构造,通常对程序员是隐藏的。不过,它也以return value of eval()
的形式出现。
变量赋值的语法期望在其右侧有一个表达式,因此使用switch语句表示该位置是语法错误:
"var" <name> "=" <expression>
基本上,语句和表达式之间的区别在于,表达式计算值,而语句则不。例如,函数调用,算术和文字都是表达式。不是“如果”和“切换”语句。
无法捕获可能期望将其包装在eval调用中的任何语句的完成值:
var a = eval('switch (3) { default: "OK" }')
console.log(a) // => "OK"
但是为此使用eval将not be a good idea。
不幸的是,没有很好的方法来存档您想做的事情。像提到的其他答案一样,您可以将开关包装在一个函数(或IIFE)中,并使用return
语句获取该值:
const a = (() => {
switch(3) { default: return "OK"; }
})();
您可能会发现这不是理想的解决方案,并且您不是唯一遇到JavaScript问题的人。
据我了解,这是pattern-matching ECAMScript提案的动机之一。但是该提案处于第一阶段,尚未准备好用于生产。
此外,您可能希望完全不需要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;
}
如果您需要非字符串大小写,则可能需要使用Map。