【问题标题】:Omitting the second expression when using the if-else shorthand使用 if-else 速记时省略第二个表达式
【发布时间】:2012-06-19 14:55:26
【问题描述】:

我可以在没有else 的情况下编写if else 速记吗?

var x=1;

x==2 ? dosomething() : doNothingButContinueCode();   

我注意到将 null 用于 else 作品(但我不知道为什么或者这是否是个好主意)。

编辑:你们中的一些人似乎对我为什么要费心尝试这个感到困惑。请放心,这纯粹是出于好奇。我喜欢玩弄 JavaScript。

【问题讨论】:

  • 我认为有一个var | var 语法。小心,因为它可能很难“看到”,特别是(IMO)三元组是有问题的。谨慎使用。
  • @JaredFarrish 三元组的重点不是比使用 if 语句更容易“看到”吗?还有你说的那个语法是什么,看起来很有趣。
  • 不,我不认为它们在所有情况下都更容易。我心中的“重点”是要么把它们全部放在一行上(“我的代码比你的代码短”),要么是针对具有简单结果的特定文字案例。堆叠三元组特别有害,应不惜一切代价避免。 :)
  • @Hassan - 我见过类似foo = bar | cat; 的东西,如果第一个是假的呢? null?,它“落入”到第二个。不过我只见过,没用过。
  • @JaredFarrish:这是a || ba && b,否则将始终评估b

标签: javascript ternary-operator conditional-operator shorthand


【解决方案1】:

对这个旧线程的一个小补充..

如果您正在使用三元运算符评估 for/while 循环内的表达式,并希望得到 continuebreak 作为结果 - 您将遇到问题,因为 @987654325 @ & break 不是表达式;它们是没有任何价值的陈述。

这将产生Uncaught SyntaxError: Unexpected token continue

for (const item of myArray) {
    item.value ? break : continue;
}

如果你真的想要一个返回语句的单行,你可以改用这个:

for (const item of myArray) {
    if (item.value) break; else continue;
}
  • P.S - 此代码可能会引起一些人的注意。只是说.. :)

【讨论】:

    【解决方案2】:

    可能最短(基于OR operator 及其precedence

    x-2||dosomething()
    

    let x=1, y=2;
    let dosomething = s=>console.log(s); 
    
    x-2||dosomething('x do something');
    y-2||dosomething('y do something');

    【讨论】:

      【解决方案3】:

      这也是一种选择:

      x==2 && dosomething();
      

      dosomething() 只有在x==2 被评估为真时才会被调用。这称为Short-circuiting

      在这种情况下它并不常用,你真的不应该编写这样的代码。我鼓励这种更简单的方法:

      if(x==2) dosomething();
      

      您应该始终编写可读的代码;如果您担心文件大小,只需借助众多 JS 压缩器之一创建它的缩小版本。 (例如谷歌的Closure Compiler

      【讨论】:

      • 哦,短路了,对。我认为大多数中级开发人员和一些“经验丰富的专业人士”对代码的可读性表示赞赏。
      • 从技术上讲,你不需要大括号:if (1 - 1 === 0) $('.woot').text('Woot!'); 我在 PHP 中一直使用这种形式,现在我正在采用 Coffeescript,我也在我的 Javascript 中使用它。跨度>
      • 我个人认为,如果它是一个小结果,如果为真.. 它更快更容易写 x == 2 && dosomething();
      • if x==2 && doSomething() || doSomethingElse()
      • 我希望 JavaScript 包含这种类似 Ruby 的语法:doSomething() if x === 2。我不怀念 Ruby,但我确实怀念它。
      【解决方案4】:

      另一种选择:

      x === 2 ? doSomething() : void 0;
      

      【讨论】:

      • 如果有人不知道为什么要使用 void 0 我建议阅读这个link
      【解决方案5】:

      您所拥有的是ternary operator 的一个相当不寻常的用法。通常它在其他操作中用作表达式,而不是语句,例如:

      var y = (x == 2 ? "yes" : "no");
      

      因此,为了可读性(因为您所做的事情不寻常),并且因为它避免了您不想要的“其他”,我建议:

      if (x==2) doSomething();
      

      【讨论】:

      • 在这里我们可以添加作为完整命令插入的完成线(如我的示例使用 jquery 淡入和淡出功能) x == 2 ? $(element).fadeIn() :$(element).fadeIn() ;不一定要有返回变量(如第一个代码中的 var y)。
      • 您必须使用三个“=”符号才能使逻辑完美。如 var y = (x === 2 ? "yes" : "no");
      • 三等号运算符仅在左右参数之间可能存在类型强制时才需要,并且仅当您实际上不打算使用类型强制时。
      【解决方案6】:

      从技术上讲,将 null 或 0 或只是一些随机的 放在那里是有效的(因为您没有使用返回值)。但是,您为什么要使用此构造而不是 if 构造?当您以这种方式编写代码时,您想要做什么就不太明显了,因为您可能会将人们与无操作(在您的情况下为 null)混淆。

      【讨论】:

        【解决方案7】:

        对于三元表达式的其中一个分支,使用 null 就可以了。并且三元表达式可以作为 Javascript 中的语句。

        不过,就风格而言,如果您想调用一个过程,那么使用 if..else 来编写它会更清晰:

        if (x==2) doSomething;
        else doSomethingElse
        

        或者,在你的情况下,

        if (x==2) doSomething;
        

        【讨论】:

          【解决方案8】:

          如果你不做其他事情,为什么不做:

          if (x==2) doSomething();
          

          【讨论】:

          • 即使你做了else也能做到
          猜你喜欢
          • 2014-08-08
          • 2013-08-30
          • 2013-07-18
          • 2021-08-10
          • 1970-01-01
          • 2012-10-26
          • 2016-10-06
          • 2011-07-17
          相关资源
          最近更新 更多