【问题标题】:Is there a better way to write this mutiple or conditional?有没有更好的方法来编写这个多重或条件?
【发布时间】:2009-06-09 07:25:16
【问题描述】:

我在 javascript 中有以下 IF 语句:

if ( !(cmd === 'JustifyLeft' || cmd === 'JustifyRight' || cmd === 'JustifyCenter' || cmd === 'JustifyFull') )

关于如何以更简洁的方式编写它的任何建议?

谢谢

【问题讨论】:

  • 如何更好?要做到。 . .快点?更清晰?代码少?更通用?更加具体?你觉得它有什么问题?
  • if 语句对我来说看起来很好。也许一些换行格式会提高可读性。
  • 我觉得这个问题更适合codereview.stackexchange.com

标签: javascript operators conditional


【解决方案1】:
if(!cmd.match(/^Justify(Left|Right|Center|Full)$/))

针对一些 cmets,您还可以通过小编辑模仿您的严格比较:

if( typeof cmd != 'String' || !cmd.match(/^Justify(Left|Right|Center|Full)$/))

这将以与您当前代码完全相同的方式做出反应,忽略任何不是字符串的内容。

我个人认为你不太可能需要它。

【讨论】:

  • 正是我们在这里需要的那种答案 :) +1 来自我
  • 我也在考虑正则表达式,但在上面的示例中使用了严格相等运算符 (===),我猜正则表达式不会进行那种严格的比较。在这种情况下,我看不出这有什么关系。 +1
  • === 运算符用于类型严格的比较。如果 cmd 不是字符串,上述操作将失败。可以这样写来避免这种情况: if(typeof(cmd) == 'string' && !cmd.match(/^Justify(Left|Right|Center|Full)$/))
  • '有些人在遇到问题时会想“我知道,我会使用正则表达式”。现在他们有两个问题。 [杰米扎温斯基]
  • 对不起,我的意思是 if (typeof(cmd) != 'string' || ...)
【解决方案2】:

这听起来像是使用开关的好情况。请注意,交换机只进行相等检查 (==) 而不是身份检查 (===),尽管这应该没问题。

switch (cmd) {
    case "JustifyLeft" :
    case "JustifyRight" :
    case "JustifyCenter" :
    case "JustifyFull" :
        // do something
    break;
    case "somethingElse" :
    default:
        // do something else
    break;
}

【讨论】:

  • 这是一种比使用正则表达式更有效的方法,因此 +1。但是“其他东西”在那里做什么呢?无论如何,它永远不会改变开关的行为。
  • 如果读者不明白,这里实际上不需要“somethingElse”的情况。
  • 是的 - 我只是在展示你将如何做相当于 else / else if 的操作。
【解决方案3】:

我会创建一个 IsJustifyCommand(s) 方法或创建一个包含 IsJustifyCommand() 方法的命令抽象类。然后代码会读起来像是它正在尝试做什么的描述。

使用正则表达式可能很简洁,但如果非核心 JavaScript 程序员必须处理代码,则会导致维护问题。但是,如果您有 很多 个案例,而 regex 是一个很好的解决方案,那么请使用它,因为任何查看代码的人都会很快接受它。

(但是我是 C# 程序员而不是 JavaScript 程序员,但像大多数程序员一样,有时我必须查看/编辑 JavaScript 代码。我认为大多数 JavaScript 都不是由 JavaScript 程序员维护的。)

【讨论】:

    【解决方案4】:

    我讨厌这样写的东西。首先,我查看代码并认为“如果 cmd 等于 JustifyLeft 或 JustifyRight ...然后将其反转并且...如果这是真的,那么做这件事.. 这意味着如果它是 JustifyLeft ...”。对我来说,这需要很长时间,而且我必须重新阅读这行内容以确保我理解正确。

    我觉得还是写比较好。

    if ((cmd !== 'JustifyLeft') && (cmd !== 'JustifyRight') && (cmd !== 'JustifyCenter') && (cmd !== 'JustifyFull'))
    

    它可能有点冗长,但我发现它更容易理解。我把它读作“cmd 不能是任何 Justify-strings”。检查一个长布尔表达式然后反转整个答案很烦人。

    我喜欢 scragar 的解决方案,只是想谈谈我对反转长布尔表达式的想法。

    【讨论】:

      猜你喜欢
      • 2012-01-17
      • 2013-08-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-14
      相关资源
      最近更新 更多