表达式在switch case语句中

Mar*_*rko 36 javascript case switch-statement

我正在尝试创建一个switch语句但我似乎无法使用得到评估的表达式(而不是设置字符串/整数).我可以使用if语句轻松完成此操作,但希望案例更快.

我正在尝试以下方法

function reward(amount) {
    var $reward = $("#reward");
    switch (amount) {
        case (amount >= 7500 && amount < 10000):
            $reward.text("Play Station 3");
            break;
        case (amount >= 10000 && amount < 15000):
            $reward.text("XBOX 360");
            break;
        case (amount >= 15000):
            $reward.text("iMac");
            break;
        default:
            $reward.text("No reward");
            break;
    }
}
Run Code Online (Sandbox Code Playgroud)

我错过了一些明显的东西,或者这是不可能的?谷歌在这种情况下并不友善.

任何帮助/指针赞赏

中号

Moo*_*Goo 113

你可以随时做

switch (true) {
  case (amount >= 7500 && amount < 10000):
    //code
    break;
  case (amount >= 10000 && amount < 15000):
    //code
    break;

  //etc...
Run Code Online (Sandbox Code Playgroud)

它的工作原理是因为它true是一个常量,所以将执行第一个case语句下的代码,其表达式的计算结果为true.

我觉得这有点"棘手",但我觉得使用它并没有错.一个简单的if/else陈述可能会更简洁,你不必担心意外跌倒.但无论如何它仍然存在.

  • 这比Daniels"回答"更好.稍加警告:将导致案例为真的所有表达式也将被评估.小心. (3认同)
  • 是的,这是有效的,因为您总是可以将 switch 函数想象成一个跳转表,它只需要匹配和检索一个值。这与 if/else 语句不同,因为所有 if 都需要实际评估。在上面,您要求您的交换机评估 vs 匹配。这就是为什么 switch case 更快的原因。 (2认同)
  • @Vontei - 使用 if/else if/else 结构,它们不会被 *all* 评估,它们只会被依次评估,直到特定条件为真,这与评估 `case` 表达式时发生的情况相同。 (2认同)

ruf*_*fin 11

@ MooGoo switch (true)Weird condition在jsLint中给你一个错误,所以如果这是一个问题,让我们更有创意,而且,我认为,增加可读性.

因此,我们不能评估如果每个casetruefalse; 我们正在比较它case的价值是否等于我们的switch期限.因此,如果条件为真,if我们可以通过在我们的case语句中添加简写并返回原始切换项来利用它.

我还包括一个真实世界的例子,你想要有两个"默认值" - 如果你的术语在正面方向上超出你的"重要"范围,那么就是一个,如果你处于负面,则另一个方向.

关键词: case (x > 0 ? x : null):

"如果我的任期,x大于零,则返回x以便x === x我接受案例分支."

http://jsfiddle.net/rufwork/upGH6/1/

/*global document*/
/*jslint evil:true*/
var x = 10;

switch (x) {
    case (x > 0 ? x : null):
        document.write('ha ha ha!  I fooled switch AND jsLint!  Muhahahahaha!');
        break;
    case 0:
        document.write('zero is nothing.');
        break;
    case -1:
        document.write('low');
        break;
    case -2:
        document.write('lower');
        break;
    case -3: 
        document.write('lowest I care about');
        break;
    default: // anything lower than -3.
        document.write('TOO LOW!!!! (unless you cheated and didn\'t use an int)');
}
document.write('<br>done.');
Run Code Online (Sandbox Code Playgroud)

  • 这可能愚弄了JSLint,但比起JSLint最初抱怨的事情,它更怪异且更难以阅读。如果您有意识地决定在需要的OP和MooGoo解释的情况下使用带有表达式的`switch`,那么您就不必担心该特定的JSLint警告。 (2认同)

Dan*_*ite 10

这不是一个switch块如何工作.所述case用于保持一个单一的值,如果它们是相等的值switch线.if-else陈述将很好地为您服务.

以下是有关该switch块的一些信息.

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/switch