繁体   English   中英

我可以使用带有两个变量的 case/switch 语句吗?

[英]Can I use a case/switch statement with two variables?

我是 JavaScript 的新手,我的理解是使用一个 SWITCH/CASE 语句比一大堆 IF 语句更快。

但是,我想使用带有两个变量的 SWITCH/CASE 语句。

我的 web 应用有两个滑块,每个滑块有五个状态。 我希望行为基于这两个变量的状态。 显然,这是一大堆 IF/THEN 语句。

我考虑过的一种方法是将两个变量连接成一个,然后我可以切换/大小写。

是否有更好的方法使用两个变量来完成 SWITCH/CASE?

谢谢 !

位运算符怎么样? 您处理的不是字符串,而是“枚举”,它看起来更“优雅”。

// Declare slider's state "enum"
var SliderOne = {
    A: 1,
    B: 2,
    C: 4,
    D: 8,
    E: 16
};

var SliderTwo = {
    A: 32,
    B: 64,
    C: 128,
    D: 256,
    E: 512
};

// Set state
var s1 = SliderOne.A,
    s2 = SliderTwo.B;

// Switch state
switch (s1 | s2) {
    case SliderOne.A | SliderTwo.A :
    case SliderOne.A | SliderTwo.C :
        // Logic when State #1 is A, and State #2 is either A or C
        break;
    case SliderOne.B | SliderTwo.C :
        // Logic when State #1 is B, and State #2 is C
        break;
    case SliderOne.E | SliderTwo.E :
    default:
        // Logic when State #1 is E, and State #2 is E or
        // none of above match
        break;


}

然而,我同意其他人的观点,一个 switch-case 逻辑中的 25 个案例并不是太漂亮,而且 if-else 在某些情况下可能“看起来”更好。 反正。

var var1 = "something";
var var2 = "something_else";
switch(var1 + "|" + var2) {
    case "something|something_else":
        ...
        break;
    case "something|...":
        break;
    case "...|...":
        break;
}

如果每个选项有 5 种可能性,您将得到 25 种情况。

是的,您也可以这样做:

    switch (true) {

     case (var1 === true && var2 === true) :
       //do something
       break;
     case (var1 === false && var2 === false) :
       //do something
       break;

      default:

    }

这将始终执行 switch,就像 if/else 一样,但看起来更干净。 只需继续检查 case 表达式中的变量即可。

首先, JavaScript 的switch并不比if/else快(有时慢得多)

其次,将switch与多个变量一起使用的唯一方法是将它们组合成一个原始值(字符串、数字等):

var stateA = "foo";
var stateB = "bar";
switch (stateA + "-" + stateB) {
    case "foo-bar": ...
    ...
}

但是,就我个人而言,我更愿意看到一组if / else语句。

编辑:当所有值都是整数时,似乎 switch 可以在 Chrome 中胜过 if/else。 看评论。

如果每个组合的动作都是静态的,你可以构建一个二维数组:

var data = [
  [1,2,3,4,5],
  [6,7,8,9,10],
  [11,12,13,14,15],
  [16,17,18,19,20],
  [21,22,23,24,25]
];

上面例子中的数字可以是任何东西,比如字符串、数组等。 获取值现在是一个单行(假设滑块的值范围为 [0,5):

var info = data[firstSliderValue][secondSliderValue];

我不相信 switch/case 比一系列 if/elseif 更快。 他们做同样的事情,但如果/elseif 的你可以检查多个变量。 您不能在多个值上使用 switch/case。

您可以为每个滑块上的每个位置指定一个从 1 到 1000000000 的不同二进制值,然后处理总和。

是的,但不是以正常方式。 您将不得不使用 switch 作为闭包。

前任:-

function test(input1, input2) {
     switch (true) {
        case input1 > input2:
                    console.log(input1 + " is larger than " + input2);
                    break;
        case input1 < input2:
                    console.log(input2 + " is larger than " + input1);
        default:
                    console.log(input1 + " is equal to " + input2);
      }
   }

我是这样做的:

switch (valueA && valueB) {

case true && false:
console.log(‘valueA is true, valueB is false’)
break;

case ( true || false ) && true:
console.log(‘valueA is either true or false and valueB is true’)
break;

default:
void 0;
}

像 scala 和 python 这样的语言为你提供了非常强大的东西,比如模式匹配,不幸的是,这仍然是 Java 中缺少的功能......

但是有一个解决方案(在大多数情况下我不喜欢),您可以执行以下操作:

final int s1Value = 0;
final int s2Value = 0;
final String s1 = "a";
final String s2 = "g";

switch (s1 + s2 + s1Value + s2Value){
    case "ag00": return true;
    default: return false;
}

在前面的选项中,将 true 传递给 switch() 并使用 switch 语句的全局变量,是选项的正确答案。 但这对我来说仍然感觉很糟糕。 我会改为使用对象解构

 const var1, var2; // variables are set outside switch // assume variables have defined values /* variables passed in by name in object deconstruction, becoming scope local to the switch closure */ switch ({ var1, var2 }) { case (var1 === true && var2 === true) : //do something break; case (var1 === false && var2 === false) : //do something break; default: }`

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM