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

use*_*967 24 javascript case switch-statement

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

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

我的网络应用程序有两个滑块,每个滑块有五种状态.我希望行为基于这两个变量的状态.显然,这是很多IF/THEN声明的全部内容.

我想到的一种方法是将两个变量连接成一个然后我可以SWITCH/CASE.

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

谢谢 !

Das*_*shK 21

一个按位运算符怎么样?而不是字符串,你处理"enums",看起来更"优雅".

// 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;


}
Run Code Online (Sandbox Code Playgroud)

然而,我同意其他人的看法,25个案例的交换案例逻辑并不太漂亮,如果 - 在某些情况下可能"看起来"更好.无论如何.

  • 单。我们在这里说“按位或”。参考:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Bitwise_Operators (2认同)

aab*_*iro 20

是的,您也可以这样做:

    switch (true) {

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

      default:

    }
Run Code Online (Sandbox Code Playgroud)

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


Hal*_*yon 18

var var1 = "something";
var var2 = "something_else";
switch(var1 + "|" + var2) {
    case "something|something_else":
        ...
        break;
    case "something|...":
        break;
    case "...|...":
        break;
}
Run Code Online (Sandbox Code Playgroud)

如果你有5种可能性,你将得到25个案例.

  • 这一点以及其他所有答案都是可怕的.正确的答案是使用`if` ... (22认同)

Dav*_*ver 9

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

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

var stateA = "foo";
var stateB = "bar";
switch (stateA + "-" + stateB) {
    case "foo-bar": ...
    ...
}
Run Code Online (Sandbox Code Playgroud)

但是,就个人而言,我宁愿看到一组if/ else陈述.

编辑:当所有值都是整数时,如果Chrome中的/是,则开关可能会超出.查看评论.

  • 啊,我们走了:切换一个整数:http://jsperf.com/switch-ifelse-map/4 (2认同)

Rya*_*n P 6

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


Ja͢*_*͢ck 5

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

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]
];
Run Code Online (Sandbox Code Playgroud)

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

var info = data[firstSliderValue][secondSliderValue];
Run Code Online (Sandbox Code Playgroud)