先进的开关盒

时间:2012-06-28 00:09:50

标签: javascript switch-statement

我想在交换机案例中使用变量。举个例子, 不能这样做。你能帮忙吗?

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

5 个答案:

答案 0 :(得分:6)

您正在寻找的是flags and bitmasks。基本上,您将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
}

Fiddled

答案 1 :(得分: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;
}

答案 2 :(得分:2)

您的switch语句似乎没必要,完全诚实。你可以使用一些简单的if

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

答案 3 :(得分:1)

原始问题 可以用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;
}

答案 4 :(得分: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));

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

由于OP的示例代码在每种情况下都包含大量重复的参数,因此该解决方案可以帮助您破解为交换机提供多于一个参数的可能性。