【问题标题】:Is a reversed switch statement acceptable JavaScript?反向 switch 语句是否可以接受 JavaScript?
【发布时间】:2011-10-05 08:31:11
【问题描述】:

JSLint 抱怨 (true)weird condition。如果我没有在反向 switch 语句中使用它,这是可以理解的。那么 JSLint 错了还是我不应该使用反向 switch 语句?

感谢任何帮助/启发。

switch (true) {
    case (menuLinksLength < 4):
        numberOfColumns = 1;
        break;
    case (menuLinksLength > 3 && menuLinksLength < 7):
        numberOfColumns = 2;
        break;
    case (menuLinksLength > 6 && menuLinksLength < 10):
        numberOfColumns = 3;
        break;
    case (menuLinksLength > 9):
        numberOfColumns = 4;
        break;
    default:
        numberOfColumns = 0;
}

【问题讨论】:

  • 对于它的价值,如果你使用switch(true===true),你可以保留你的反向 switch 语句并且仍然满足 linter。这不是对这种做法的认可;)
  • switch(true===true) 没有帮助,因为这会导致它抱怨“奇怪的关系”。
  • var theTruth = true; ----- switch(theTruth) {...}

标签: javascript switch-statement jslint


【解决方案1】:

我个人不希望在代码库中看到颠倒的switch。与普通的 if/elseif 块相比,它不会给您带来任何好处,而且它的奇特性质可能会引起混淆。

这也是 JSLint 所抱怨的:

你正在做一些非正统的事情。有充分的理由吗?如果 不,最好还是坚持基础。

【讨论】:

  • 我知道这都是个人喜好。但就我个人而言,我发现大量的 if 语句要混乱得多。
  • 但这就是 JSLint 的全部意义所在。它不仅建议您使用非法代码,还建议您使用糟糕的编码实践。而这个“反向开关”是“聪明”代码的一个很好的例子(,未来更改可能会中断的代码,并且不是特别可读)。
【解决方案2】:

ECMA-262 标准第三版(Firefox 1.0+、Google Chrome 1.0+、MSIE 5.5+ 等支持)定义了这一点

switch (expression) {
    case label1:
        statements1
    .
    .
    .
}

如果(expression) 匹配label1,则执行statements1

这意味着您的switch 声明完全没问题。

我在 Firefox、Chrome 和 IE 上试用过。没有人抱怨...

编辑:

现在是猜测部分:

JSLint 是一个代码分析工具。当它看到switch (true) 时,它假定您不知道自己在做什么。 奇怪并不一定意味着错误...

【讨论】:

  • 它给我带来问题的原因是因为我工作的公司在他们的构建脚本中使用它,当 JSLint 返回“奇怪”时它会失败。我不知道 JSLint 中的错误是如何分类的,但我想这可能不是它的错。感谢您的帮助。
  • 那么没有办法禁用此检查?
  • @Danny:没有线索。我从未使用过 JSLint。
  • 把这个问题留给任何可能知道的人:How to disable the Weird Condition check in JSLint?
【解决方案3】:
numberOfColumns = Math.max(4, Math.floor(menuLinksLength / 3));

这将为您提供与现有代码相同的结果。您的问题相当模棱两可,因为“可接受”是一个非常主观的术语。我个人会拒绝任何带有反向 switch 语句的合并请求,因为我实际上想不出不能用更简单和/或更易于阅读的东西代替的情况。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-24
    • 2014-09-10
    • 1970-01-01
    • 2021-11-04
    • 2011-08-12
    • 2021-08-11
    • 1970-01-01
    相关资源
    最近更新 更多