Javascript switch case语句中的表达式

Javascript switch case语句中的表达式,javascript,switch-statement,case,Javascript,Switch Statement,Case,我试图创建一个switch语句,但我似乎无法使用得到计算的表达式(而不是一个集合字符串/整数)。我可以很容易地用if语句实现这一点,但case应该更快 我正在尝试以下内容 function reward(amount) { var $reward = $("#reward"); switch (amount) { case (amount >= 7500 && amount < 10000): $reward.t

我试图创建一个switch语句,但我似乎无法使用得到计算的表达式(而不是一个集合字符串/整数)。我可以很容易地用if语句实现这一点,但case应该更快

我正在尝试以下内容

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;
    }
}
功能奖励(金额){
var$奖励=$(“#奖励”);
开关(数量){
案例(金额>=7500和金额<10000):
$reward.text(“播放站3”);
打破
案例(金额>=10000和金额<15000):
$reward.text(“XBOX 360”);
打破
案例(金额>=15000):
$reward.text(“iMac”);
打破
违约:
$reward.text(“无奖励”);
打破
}
}
我是否遗漏了一些明显的东西,或者这是不可能的?谷歌在这件事上并不友好

感谢您的帮助/指点


M

这不是
开关
块的工作方式。
案例
用于保存单个值,如果它们等于
开关
行上的值
if-else
语句将很好地为您服务

下面是有关
开关
块的一些信息


首先,这不是
开关的工作原理。您必须为每个
案例
指定常量,这些常量将与括号中的表达式进行比较(在您的案例中,
金额
)。这就是
开关的工作原理,句号

其次,切换速度不超过几个
if
s

第三,在处理javascript时,您不应该真的担心微小的性能优化

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

  //etc...
开关(真){
案例(金额>=7500和金额<10000):
//代码
打破
案例(金额>=10000和金额<15000):
//代码
打破
//等等。。。
它之所以有效,是因为
true
是一个常量,因此将执行第一个case语句下的代码,该语句的表达式的计算结果为true


这有点“棘手”我猜,但我看不出使用它有什么错。一个简单的
if/else
语句可能会更简洁,而且您不必担心意外的失败。但它确实存在。

问题是开关表达式永远不能等于大小写表达式,因为大小写表达式的计算结果将为true或false,但是t开关表达式将是一个数字

将switch表达式设置为true的解决方案之所以有效,不是因为true是常量,而是因为实际上可以与case表达式相等

并非必须为每个case表达式指定常量

要支持我的回答,请参阅Douglas Crockford,《Javascript好的部分》(2008),第12页:

switch语句执行多路分支。它将表达式与所有选定的事例进行相等比较…当找到精确匹配时,将执行匹配事例子句的语句…事例子句包含一个或多个事例表达式。事例表达式不必是常量

@MooGoo's会给你一个,所以如果这是一个问题,让我们更具创造性,并且,我认为,增加可读性

因此,我们不是在评估每个
案例
是否为
;我们是在比较
案例
的值是否等于我们的
开关
项。因此,让我们利用这一点,在
案例
语句中插入一个缩写
if
,如果条件为真

我还举了一个现实世界的例子,你想要两个“默认值”——一个是你的术语在积极方向上超出了“重要”范围,另一个是在消极方向上

关键词:
大小写(x>0?x:null):

“如果我的术语,
x
大于零,则返回
x
,以便
x==x
,我接受案例分支。”

/*全局文档*/
/*jslint邪恶:真的*/
var x=10;
开关(x){
案例(x>0?x:null):
写(‘哈哈哈!我愚弄了switch和jsLint!哈哈哈!’);
打破
案例0:
写(‘零不算什么’);
打破
案例1:
文件。写入(“低”);
打破
案例2:
文件。写('lower');
打破
案例3:
写下(‘我关心的最低限度’);
打破
默认值://任何低于-3的值。
document.write('toolow!!!!(除非你作弊并且没有使用int)');
}
文档。写入(“
完成”);

快速回复: 请注意,
default:
开关显示“除非您作弊并且没有使用int”,并且当您返回
x
时,短路需要
x==x

但您的观点是一个有用的提醒,即
NaN
是唯一不能应用短路的情况

也就是说,
x
必须
==x
才能在
开关中短路,并且,正如MDN告诉我们的那样,“(双重或三重
=

这也意味着打开
NaN
值(并且只有
NaN
值)将始终在ANY
开关中点击
默认值,因为您无法匹配其值

以下是对以下内容的完整引用:

NaN将不相等(通过==、!=、==、和!==)与任何其他值(包括另一个NaN值)进行比较。使用或可最清楚地确定某个值是否为NaN。或执行自比较:NaN(且只有NaN)将与自身进行不相等比较

您可以更改
默认逻辑来检查您拥有的:

isNaN(x)?document.write('nan'):document.write('TOO LOW!!!!…');

或者你甚至可以去吃晚饭
/*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.');
function reward(amount) {
    var $reward = $("#reward");
    $reward.text(
        (amount >= 7500 && amount < 10000) ?    "Play Station 3" :
        (amount >= 10000 && amount < 15000)?    "XBOX 360" :
        (amount >= 15000) ?                     "iMac" :
                                                "No reward"
    );
}
var x = 6, factors = [];

switch(x){

    case (x%2 == 0): factors.push(2);
    break;

    case (x%3 == 0): factors.push(3);
    break;
    ....
 }
function xbox(amount) { return amount >= 10000 && amount < 15000 && amount; }

function reward(amount) {
  var ps3 = function(amount) { return amount >= 7500 && amount < 10000 && amount; }

  function imac(amount) { return amount >= 15000 && amount; }

  var $reward = $("#reward");
  switch (amount) {
    case ps3(amount):
      $reward.text("Play Station 3");
      break;
    case xbox(amount):
      $reward.text("XBOX 360");
      break;
    case imac(amount):
      $reward.text("iMac");
      break;
    default:
      $reward.text("No reward");
      break;
  }
}
reward(8200)// -> Play Station 3
reward(11000)// -> XBOX 360
reward(20000)// -> iMac
function reward(amount) {
    var $reward = $("#reward");
    switch (amount) {
        case (amount >= 7500 && amount < 10000 && amount):
            $reward.text("Play Station 3");
            break;
        case (amount >= 10000 && amount < 15000 && amount):
            $reward.text("XBOX 360");
            break;
        case (amount >= 15000 && amount):
            $reward.text("iMac");
            break;
        default:
            $reward.text("No reward");
            break;
    }
}