4

我想在开关盒中使用变量。举个例子,做不到。你能帮我吗?

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

5 回答 5

10

您正在寻找的是flags 和 bitmasks。基本上,您将多个伪布尔值存储在同一个变量中,您可以访问它们的复合条件。这样做的好处是您可以将多个属性组合成一个变量。当您需要跟踪更多布尔属性时,这尤其简洁

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
}

摆弄

于 2012-06-28T01:35:58.623 回答
4

原始问题可以写成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;
}
于 2016-01-16T20:04:39.777 回答
2

您编写的是合法的 JavaScript,但它并没有达到您的预期。

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

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

在 switch 和 case 语句中使用逗号运算符时,将丢弃第一个值并使用最后一个值。看这个小提琴的例子:http: //jsfiddle.net/UG4vf/

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

switch(pay){
   case true:
       blah blah...
   break;
   case true:
       blah blah..
   break;
   case false:
      blah blah...
   break;
}
于 2012-06-28T00:19:26.167 回答
2

老实说,您的 switch 语句似乎没有必要。您应该可以接受一些简单if的 's:

if (basket && pay) {
  // code
} else if (pay) {
  // code
} else {
  // code
}
于 2012-06-28T00:34:47.073 回答
0

使用此解决方案,您可以为开关提供多个参数:

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

除了作为条件的对象外,这也适用于数组,但是使用此解决方案的缺点是您必须将完整的开关条件值传递给开关情况条件。例如,如果 switch 案例关心属性a并且b来自示例而不是,c那么这个解决方案将不起作用。但是,如果您确定这c将始终对您的案例具有特定价值,那么您可以使用此解决方案。

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

于 2019-11-13T15:55:35.270 回答