javascript:在切换情况下使用条件
对不起,这个愚蠢的问题。 如何在javascript switch-case语言元素中使用一个案例的条件? 就像在下面的例子中,当variablesliCount <= 5和> 0时,情况应该匹配。 但是,我的代码不起作用: 
 switch (liCount) { case 0: setLayoutState('start'); var api = $('#UploadList').data('jsp'); api.reinitialise(); break; case (liCount<=5 && liCount>0): setLayoutState('upload1Row'); var api = $('#UploadList').data('jsp'); api.reinitialise(); break; case (liCount<=10 && liCount>5): setLayoutState('upload2Rows'); var api = $('#UploadList').data('jsp'); api.reinitialise(); break; case (liCount>10): var api = $('#UploadList').data('jsp'); api.reinitialise(); break; } 
感谢您的任何build议!
请参阅下面的dmp的答案 。 如果可以,我会删除这个答案,但它被接受,所以这是下一个最好的事情:)
  你不能。  JS解释器要求你比较switch语句(比如没有“case when”语句)。  如果你真的想这样做,你可以使 if(){ .. } else if(){ .. }块。
这工作:
 switch (true) { case liCount == 0: setLayoutState('start'); var api = $('#UploadList').data('jsp'); api.reinitialise(); break; case liCount<=5 && liCount>0: setLayoutState('upload1Row'); var api = $('#UploadList').data('jsp'); api.reinitialise(); break; case liCount<=10 && liCount>5: setLayoutState('upload2Rows'); var api = $('#UploadList').data('jsp'); api.reinitialise(); break; case liCount>10: var api = $('#UploadList').data('jsp'); api.reinitialise(); break; } 
 答案的以前版本认为括号是罪魁祸首。 实际上,括号在这里是无关紧要的 – 唯一需要的是switch(true){...} ,对于你的caseexpression式来计算布尔值。 
 这是有效的,因为我们给交换机的价值是作为比较的基础。 因此,对布尔值进行评估的案例expression式将决定运行哪个案例。 也可以把这个转过来,并通过switch(false){..}和所需的expression式评估为假而不是真正的..但个人喜欢处理条件,评估真相。 但是,它也可以工作,所以值得记住去理解它在做什么。 
 例如:如果liCount是3,第一个比较是true === (liCount == 0) ,这意味着第一个情况是错误的。 然后切换到下一个true === (liCount<=5 && liCount>0) 。 该expression式的计算结果为true,意味着这种情况下运行,并终止在break 。 我已经在这里添加括号来使其更清楚,但它们是可选的,取决于expression的复杂性。 
 这是非常简单的,而且是一个整洁的方式(如果它符合你所要做的)处理一系列长条件,在这里或许是一长串“ ìf() ... else if() ... else if () ...可能会引入很多视觉噪音或脆弱性。 
谨慎使用,因为它是非标准模式,尽pipe是有效的代码。
你已经完成了复杂的过程。 用if语句写下来,如下所示:
 if(liCount == 0) setLayoutState('start'); else if(liCount<=5) setLayoutState('upload1Row'); else if(liCount<=10) setLayoutState('upload2Rows'); $('#UploadList').data('jsp').reinitialise(); 
或者,如果ChaosPandion试图尽可能优化:
 setLayoutState(liCount == 0 ? 'start' : liCount <= 5 ? 'upload1Row' : liCount <= 10 ? 'upload2Rows' : null); $('#UploadList').data('jsp').reinitialise(); 
你想使用if语句:
 if (liCount === 0) { setLayoutState('start'); } else if (liCount <= 5) { setLayoutState('upload1Row'); } else if (liCount <= 10) { setLayoutState('upload2Rows'); } $('#UploadList').data('jsp').reinitialise(); 
 这是你应该使用if子句的情况。 
 如果这就是你想要做的,最好使用if语句。 例如: 
 if(liCount == 0){ setLayoutState('start'); } if(liCount<=5 && liCount>0){ setLayoutState('upload1Row'); } if(liCount<=10 && liCount>5){ setLayoutState('upload2Rows'); } var api = $('#UploadList').data('jsp'); api.reinitialise(); 
如果可能的值是整数,则可以将案例分组。 否则,使用ifs。
 var api, tem; switch(liCount){ case 0: tem= 'start'; break; case 1: case 2: case 3: case 4: case 5: tem= 'upload1Row'; break; case 6: case 7: case 8: case 9: case 10: tem= 'upload2Rows'; break; default: break; } if(tem) setLayoutState((tem); api= $('#UploadList').data('jsp'); api.reinitialise(); 
 switch (true) { case condition0: ... break; case condition1: ... break; } 
 只要您的条件返回适当的boolean值,就可以在JavaScript中工作,但与else if语句相比,它没有多less优势。 
你的代码不工作,因为它没有做你期望的事情。 开关块接受一个值,并将每个情况与给定值进行比较,寻找相等性。 您的比较值是一个整数,但大多数情况expression式parsing为布尔值。
 举个例子,说liCount = 2 。 你的第一个案件不匹配,因为2 != 0 。 你的第二种情况(liCount<=5 && liCount>0)计算结果为true ,但是2 != true ,所以这种情况也不会匹配。 
 因为这个原因,正如许多人所说的,你应该使用一系列if...then...else if blocks来做到这一点。