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

IT技术 javascript switch-statement case
2021-01-14 01:15:03

我是 JavaScript 的新手,据我所知,使用一个 SWITCH/CASE 语句比使用一大堆 IF 语句要快。

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

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

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

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

谢谢 !

6个回答

是的,您也可以这样做:

    switch (true) {

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

      default:

    }

这将始终执行 switch,就像 if/else 一样,但看起来更干净。只需继续检查 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;


}

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

单身的。我们在这里谈论“按位或”。参考:developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/...
2021-03-15 01:15:03
单人|还是双人||
2021-03-26 01:15:03
当枚举未在位范围内定义时,这不起作用,因此这是一个误导性指令。
2021-03-30 01:15:03
var var1 = "something";
var var2 = "something_else";
switch(var1 + "|" + var2) {
    case "something|something_else":
        ...
        break;
    case "something|...":
        break;
    case "...|...":
        break;
}

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

这,连同这里的所有其他答案,都是可怕的。正确答案是使用if...
2021-03-16 01:15:03
@BlueRaja-DannyPflughoeft 如此真实:)
2021-03-18 01:15:03
@BrianHannay|插入了一个额外的内容,案例必须是"something|something_else|". 虽然它并不出色,但我的回答假设您可以完全控制var1var2如果你假设你没有,你的答案是什么?
2021-03-20 01:15:03
@Halcyon 我不相信有很好的方法可以做到,但是嵌套的 switch 语句(带有变量选项)可以工作。我只是想不出第二个滑块(在 OP 的问题中)产生的动作取决于第一个滑块的值的情况。
2021-03-30 01:15:03
考虑情况var1 = "something|something_else";var2 = "";
2021-04-10 01:15:03

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

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

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

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

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

重复相同的测试,但与。比如说100个案例。差异将变得明显。
2021-04-03 01:15:03
哦,疯了,但似乎我的数字测试用例被我的字符串测试用例覆盖了。无论如何,数字更快,字符串是相同的。
2021-04-05 01:15:03
嗨,大卫,谢谢,能够比较切换与 if/else 并通过整数和字符串进行比较真是太棒了。似乎开关和整数对于 FF9.01 是最快的
2021-04-07 01:15:03
啊,在我的浏览器上,当被切换的值是整数时,您似乎是正确的:jsperf.com/switch-ifelse-map/3
2021-04-09 01:15:03
不一定必须是整数。不过,您的测试用例必须进行修改。散列通常是switch,else if和 中最有效的选项{}经常检查时,创建散列的开销可以忽略不计。它优于switch并且else if从长远来看。
2021-04-12 01:15:03

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