高级开关盒

advanced switch case

本文关键字:开关 高级      更新时间:2023-09-26

我想在开关情况下使用变量。 例如,做不到。你能帮忙吗?

switch(basket,pay){
   case true, true:
       blah blah...
   break;
   case false,true:
       blah blah..
   break;
   case false, false:
      blah blah...
   break;
}

你要找的是标志和位掩码。基本上,您将 myltiple 伪布尔值存储在同一个变量中,您可以访问它们的复合条件。这样做的好处是您可以将多个属性复合到单个变量中。当需要跟踪的布尔属性更多时,这尤其整洁

var FLAG_BASKET = 0x1; // 0001  
var FLAG_PAY = 0x2; // 0010
//set them both to pseudo-true
var flags = FLAG_BASKET | FLAG_PAY;
switch (flags){
  case 0x0://both are false
  case 0x1://basket is true, pay is false
  case 0x2://basket is false, pay is true
  case 0x3://both are true
}

摆弄

原始问题可以用switch来编写:

switch (true) {
    case basket && pay:
    // both true
    break;
    case basket && !pay: 
    // basket true, pay false
    break;
    case !basket && pay:
    // basket false, pay true
    break;
    case !basket && !pay:
    // basket false, pay false
    break;
}

你写的是合法的JavaScript,但它并没有达到你的期望。

在表达式中,逗号的计算结果为最后一个成员。这通常用于 for 循环中,以同时初始化两个变量:

for(var i = 0, l = myArray.length; i < l; ++i) {
    ...
}

在开关和 case 语句中使用逗号运算符时,将丢弃第一个值,并使用最后一个值。有关示例,请参阅此小提琴:http://jsfiddle.net/UG4vf/

不是比较两个值并找到与这两个值匹配的情况。换句话说,您的上述代码简化为:

switch(pay){
   case true:
       blah blah...
   break;
   case true:
       blah blah..
   break;
   case false:
      blah blah...
   break;
}

老实说,你的switch语句似乎没有必要。 你应该可以使用一些简单的if

if (basket && pay) {
  // code
} else if (pay) {
  // code
} else {
  // code
}

使用此解决方案,您可以为交换机提供多个参数:

const a = "foo";
const b = true;
const c = null;
const condition = JSON.stringify({ a, b, c });
function mySwitch(condition) {
  switch (condition) {
    case JSON.stringify({
      a: "foo",
      b: true,
      c: true
    }):
      return 'case { a: "foo", b: true, c: null }';
    case JSON.stringify({
      a: "foo",
      b: true,
      c: null
    }):
      return 'case { a: "foo", b: true, c: null }';
    default:
      return 'default';
  }
}
console.log("condition:", condition);
console.log("result:", mySwitch(condition));

除了对象作为条件之外,这也适用于数组,但是使用此解决方案的缺点是您必须将完整的开关条件值传递给开关大小写条件。例如,如果开关大小写关心属性a和示例中b而不是c则此解决方案将不起作用。但是,如果您确定c将始终对您的案例具有特定值,则可以使用此解决方案。

由于 OP 的示例代码包含每种情况的重复参数,因此此解决方案可以帮助您破解为开关提供多个参数的可能性。