javascript:在 switch case 中使用条件

IT技术 javascript conditional-statements select-case
2021-01-13 09:08:40

对不起,这个愚蠢的问题。如何在 javascript switch-case 语言元素中为 case 使用条件?像下面的例子一样,当变量liCount<=5 和 >0时,case 应该匹配但是,我的代码不起作用:

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

感谢您的任何建议!

6个回答

这有效:

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){...}并且让您的 case 表达式计算为布尔值。

之所以有效,是因为我们提供给 switch 的值被用作比较的基础。因此,case 表达式,也计算为布尔值将确定运行哪个 case。也可以扭转这一switch(false){..}局面,并通过并让所需的表达式评估为 false 而不是 true.. 但个人更喜欢处理评估为真的条件。但是,它也确实有效,因此值得牢记以了解它在做什么。

例如:如果 liCount 为 3,则第一次比较为true === (liCount == 0),这意味着第一种情况为假。然后切换到下一个案例true === (liCount<=5 && liCount>0)此表达式的计算结果为 true,这意味着此案例已运行,并在 处终止break我在此处添加了括号以使其更清楚,但它们是可选的,具体取决于表达式的复杂性。

它非常简单,而且是处理一系列条件的一种巧妙方法(如果它适合您尝试做的事情),其中可能ìf() ... else if() ... else if () ...会引入大量视觉噪音或脆弱性。

谨慎使用,因为它是一种非标准模式,尽管它是有效代码。

你知道,这不是因为你可以,你应该这是需要用火杀死的东西。
2021-03-13 09:08:40
它是语言的一部分 - 因此,了解它总比不了解好。显然,它并不适用于所有情况,但在纯粹的主观层面上,我认为这是一种有趣的方法,并且在这种情况下比一系列 ifs/elifs 更清晰/更不脆弱。要记住的重要一点是,编码是意图的表达,再加上品味和实践。有更多的选择在代码中清楚地表达自己从来都不是一件坏事。
2021-03-13 09:08:40
我想你需要有switch(true) {case liCount == 0:对吧?否则这个比较是liCount == (liCount <=5 && liCount > 0).
2021-03-25 09:08:40
你甚至睁开眼睛看看如果 switch 表达式是假的结果会是什么 switch(false) { }
2021-04-04 09:08:40
对我来说,这是非常有用的一种很好的方式来组织我的逻辑,我需要根据 if 条件一遍又一遍地使用变量名,但这是一个 n+1 类型的场景,所以事实上 switch 语句 case 没有休息将移动到下一行下面非常有用。
2021-04-06 09:08:40

你已经把事情复杂化了。用 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();
你必须去和我一个。:)
2021-03-14 09:08:40
@Eric - 一些程序员的编程圈数比我说的多:“仅仅因为你可以不用大括号编写 Javascript(而且 - 事实上小心 - 分号)并不意味着你应该”,但我只是重写了一些if 语句就像你的例子一样,所以谢谢 - 工作正常,直到在条件之后执行多于一行。不过,三元解决方案对我来说太遥远了……
2021-03-20 09:08:40
@Chaos:是的,这可能太过分了。您还必须添加一个空检查setLayoutState:P。
2021-03-24 09:08:40
我们同时写了我们的帖子。在我已经发布之前我没有看到你的。现在看来你做得太过分了...
2021-03-29 09:08:40
哇,我真的没有考虑过复杂的条件。
2021-04-04 09:08:40

你想使用 if 语句:

if (liCount === 0) {
    setLayoutState('start');
} else if (liCount <= 5) {
    setLayoutState('upload1Row');
} else if (liCount <= 10) {
    setLayoutState('upload2Rows');
}
$('#UploadList').data('jsp').reinitialise();  

请参阅下面dmp 的回答如果可以的话,我会删除这个答案,但它被接受了,所以这是下一个最好的事情:)

你不能。JS 解释器要求您与 switch 语句进行比较(例如,没有“case when”语句)。如果你真的想这样做,你可以制作if(){ .. } else if(){ .. }块。

那是不正确的。这是一个演示它的工作原理jsfiddle.net/Ender/fr3wLECMAScript 标准明确指出这是允许的:docstore.mik.ua/orelly/webprog/jscript/ch06_05.htm#FOOTNOTE-18
2021-03-20 09:08:40
@Aistina 不是。由于他的案例条件产生的是真/假值而不是数值,因此 haemse 将需要测试他的案例的真实值(例如 danp 的答案所建议的),而不是针对 的数值进行测试liCount我只是指出 cwolves 原始声明“JS 解释器要求 case 语句是静态值”是不正确的。狼队已经修改了这个声明,所以我的评论不再相关。
2021-03-28 09:08:40
因为这并没有回答这个问题。他并没有要求采取不同的方式来做到这一点,他要求让开关盒像他想要的那样工作。“以其他方式做”几乎从来都不是一个正确的答案,尽管我们几乎一直认为它是。我们一直认为我们有更好的方法,但这不是他想要的方式,这使得这个答案完全错误。
2021-03-30 09:08:40
@Ender 这与 haemse 试图做的事情有何相同之处?
2021-04-03 09:08:40
@Jasmine - “你不能,所以做其他方式”是完全有效的,如果它是正确的我的答案被否决了,因为它是错误的:) 正如@danp 指出的那样,你可以切换true,它就可以工作。但它已经超过 3 岁了,所以我真的不在乎。
2021-04-07 09:08:40
switch (true) {
  case condition0:
    ...
    break;
  case condition1:
    ...
    break;
}

只要您的条件返回正确的boolean值,它就可以在 JavaScript 中工作,但与else if语句相比,它没有太多优势

但是它应该像其他语句一样工作,例如,如果您使用if (10) {..}flow 应该传入If条件,不是吗?因为 10 或除 0 以外的任何整数都将被视为真值并允许进入条件。不确定他在这里的 switch 语句有什么问题。
2021-03-17 09:08:40
哦,这样,谢谢。这对我来说是全新的。@麦克风
2021-03-17 09:08:40
@PardeepJain,switch根本不像if. if测试条件是否为switch测试 之后的表达式是否switch===CaseClauseIsSelected 步骤 4)之后的表达式的值case
2021-04-07 09:08:40
如果我10在 switch 语句中传递一些整数,它会起作用吗?在我的情况下,不知道是什么原因。
2021-04-09 09:08:40
10 !== true, 所以不行。是否有一些变量可能具有值10如果x,那么case x === 10:会起作用。
2021-04-12 09:08:40