用于2个布尔值的javascript开关盒

用于2个布尔值的javascript开关盒,javascript,boolean,switch-statement,boolean-logic,Javascript,Boolean,Switch Statement,Boolean Logic,我有两个布尔值,boolA和boolB。 我想要一个switch case语句,它包含四种可能的组合, i、 例如 switch(boolA boolB){ case 0 0: [do something]; case 0 1: [do something else]; case 1 0: [do another thing]; case 1 1: [do the other thing]; 基本上,我希望switch case将两个布尔值解释为

我有两个布尔值,boolA和boolB。 我想要一个switch case语句,它包含四种可能的组合, i、 例如

switch(boolA boolB){
  case 0 0:
    [do something];
  case 0 1:
    [do something else];
  case 1 0:
    [do another thing];
  case 1 1:
    [do the other thing];
基本上,我希望switch case将两个布尔值解释为一个2位数字


更新:我决定只使用普通的if-else工具。

我想我不会这么做

但如果您确实想,可以使用
boolA+“”+boolB

switch(boolA + " " + boolB){
  case "false false":
    [do something];
    break;
  case "false true":
    [do something else];
    break;
  case "true false":
    [do another thing];
    break;
  default: // "true true"
    [do the other thing];
    break;
}
switch((10 * boolA) + boolB){
  case 0:
    [do something];
    break;
  case 1:
    [do something else];
    break;
  case 10:
    [do another thing];
    break;
  default: // 11
    [do the other thing];
    break;
}
或者如果你喜欢数字,
(10*boolA)+boolB

switch(boolA + " " + boolB){
  case "false false":
    [do something];
    break;
  case "false true":
    [do something else];
    break;
  case "true false":
    [do another thing];
    break;
  default: // "true true"
    [do the other thing];
    break;
}
switch((10 * boolA) + boolB){
  case 0:
    [do something];
    break;
  case 1:
    [do something else];
    break;
  case 10:
    [do another thing];
    break;
  default: // 11
    [do the other thing];
    break;
}
规范中保证了这两种隐式转换。

文档引用此方法,通过使开关求值
true
,然后将逻辑放入开关语句中,来实现您想要的结果

switch (true) { // invariant TRUE instead of variable foo
    case a && b:
    //logic
        break;
    case a && !b:
    //logic
        break;
    case !a && b:
    //logic
        break;
    case !a && !b:
    //logic
        break;
}

我会使用常规的if-else-if逻辑来让事情更清楚。

另一种实现方式是根本不使用switch语句。您可以创建一个javascript对象,将布尔值映射为函数对象的键

var truthTable = {
    false: {
        false: falsefalseFunc,
        true: falsetruefunc
    },
    true: {
        false: truefalseFunc,
        true: truetrueFunc
    }
}
其中FalseFunc、falsetrueFunc等。。。是函数对象。然后你可以这样称呼它:

truthTable[boolA][boolB]();
我决定用

switch(parseInt(boolB.toString()+boolA,2)){
  case 0://neither
    [do something];
  case 1://boolA
    [do something else];
  case 2://boolB
    [do another thing];
  case 3://both
    [do the other thing];
}

它将布尔值解析为二进制数中的位。

ES6备选方案与:

开关(`${+boolA}${+boolB}`){
案例“00”://逻辑
打破
案例“10”://逻辑
打破
案例“01”://逻辑
打破
案例“11”://逻辑
打破
}

这样做的问题是,如果bool是函数调用(想必
boolA
boolB
不是,但在这里进行概括),这些调用会重复进行,直到找到匹配的案例。我甚至在看到MDN上的文档之前都不确定这是可能的,但有一个很好的警告:-)是的,JavaScript的
开关
基本上只是
if…else if…else if
的语法糖,不像大多数其他语法源自B的语言。在JavaScript中,大小写可以是表达式而不是常量,它们是按源代码顺序计算的(没有跳转表等——当然,如果使用常量,引擎可以自由优化…)。当使用node.js时,由于某种原因,a&&b案例永远不会成立