如何从switch语句中获取返回值?

时间:2011-07-07 14:48:39

标签: javascript

在chrome的控制台中,当我输入:

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

所以看起来switch语句有一个返回值。但是当我这样做时:

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

抛出语法错误“Unexpected Token switch”

是否可以捕获交换机的return语句?

7 个答案:

答案 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