【问题标题】:Is it safe to run code inside the conditional operator?在条件运算符中运行代码是否安全?
【发布时间】:2012-02-03 22:00:32
【问题描述】:

我经常看到和使用这样的代码:

var myvar = (1 < 2) ? 3 : 4 ; //if 1 < 2 then myvar = 3, else = 4

但我最近才看到一个正在执行代码的代码,就像 if(){}else{} 的某种替换:

示例:

(1 < 2) ? alert("example1") : alert("example2");

我的第一个想法是,“哇,这好像缩短了 6 到 7 个字符”、“无限可能”或“这让我很开心”。

我的问题:

  • 这个东西没有错误并且使用安全吗? (比如,里面有很多代码,还有嵌套的东西)

目前,我将继续以正常方式使用它,我担心如果我开始使用它来执行代码片段可能无法正常工作。

【问题讨论】:

  • 在我看来,您应该仅将三元条件用于简短说明。对于属于真条件或假条件的代码块,你应该使用 if{} else {},但这只是我的意见。我也对使用这种三元条件的最佳方法感兴趣。

标签: javascript conditional-operator


【解决方案1】:

这个东西没有错误并且可以安全使用吗? (比如,有很多代码 内部和嵌套的东西)

是的。但是,其中的代码越多,可读性就越差。

我更喜欢将它(条件运算符)用于简短、简洁的语句。为了可读性和可维护性,任何更复杂的东西都值得if/else。

【讨论】:

  • 我在制作项目时通常有 2 个版本,一个带有长 var 名称和内容的原始版本,一个带有较少代码的版本。 (我只打算第二次用这种方法)
  • 有趣。为什么还有第二个?对我来说,这只是需要维护更多的代码。如果您专门针对 javascript 和第二个进行缩小,那么已经有一些东西可以做到这一点。 :)
  • 我知道 JS 缩小器,我只是怀疑他们会用这种方法缩小 if/else
  • 可能是真的,尽管就像@minitech 所说,保存几个字符并不是编写难以维护的代码或为此维护两个代码副本的最佳理由。您必须通过网络发送的额外字节值得您节省时间和挫败感,而无需花费 6 天时间来调试包含 13 条语句的深度条件表达式。
  • @ajax333221: 试试Google Closure Compiler 这个代码:// ==ClosureCompiler== // @output_file_name default.js // @compilation_level ADVANCED_OPTIMIZATIONS // ==/ClosureCompiler== if(a) { alert('Hello, world!'); } else { alert('!dlrow ,olleH'); } ;)
【解决方案2】:

有一些例外。你不能这样做:

  • break
  • continue
  • if、for、while、do 或 try 等任何块

例如。更重要的是,它可能会扰乱您的操作顺序:

x < 3 ? l = true : r = true; // Syntax error, = has lower precedence than ?:

但这不是不这样做的原因,而是因为它很丑。你更清楚哪一个,这个:

if(i > 5) {
    alert('One');
} else {
    alert('Two');
}

或

i > 5 ? alert('One') : alert('Two');

?这不太对,是吗?拯救角色永远不是做任何事情的理由,真的;否则将没有 cmets 或空白。像 Google Closure Compiler 这样的好压缩器会在可能的情况下自动为您转换这些,还有很多其他地方可以保存。最后,它只是您认为最方便和可读的任何内容。

另外,如果你最终需要break、continue 等,那么它的代码将相当不一致且没有吸引力。

【讨论】:

  • 接受是因为指出了显然没有其他人知道它们存在的例外情况(或者至少,他们都只是怀疑地决定在他们的答案中不提及它们)
【解决方案3】:

您指的是ternary 运算符。它通常用于设置具有简单字符串的变量,如下所示:

var phone = old ? "blackberry" : "iPhone"

这比使用 if 简单得多:

var phone = "iphone"
if (old) {
    phone = "blackberry"
}

在这种情况下很好,在你描述的例子中,一旦它开始变得混乱,或者我绝对不推荐它!

你的例子可能会变得更好:

var msg = 1 < 2 ? "alert1" : "alert2";
alert(msg);

【讨论】:

    【解决方案4】:

    你也可以写:

    alert( 1<2? "example1" : "example2" );
    

    三元运算符是为简单的情况而设计的,有时开发人员会忘乎所以并用它来替换多个 if..else 语句,例如

    var someVal = foo < bar? 'yes' : bar > fum? : fum : fi != fee? fi : fee;
    

    恕我直言,这不是一个好主意。

    【讨论】:

      猜你喜欢
      • 2014-11-01
      • 1970-01-01
      • 2011-09-30
      • 1970-01-01
      • 1970-01-01
      • 2017-12-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多