【问题标题】:If true … else Shorthand如果为真……否则速记
【发布时间】:2014-10-17 02:07:58
【问题描述】:

我知道这个 if 语句的正常用例是例如

var string = boolean ? "this" : "that";

我在我的编辑器中使用 jhint,当我尝试类似的东西时

boolean ? array.push("this") : array.slice("that",1);

jshint throws (W030)“期望一个赋值或函数调用,而是看到一个表达式”

到目前为止,代码一直运行良好,但也许我很幸运。

所以我的问题是,为什么我不应该使用这种模式,还有什么替代方案?因为写

if(boolean){
    array.push("this");
} else {
    array.splice("that",1);
}

这么短的说明真的让我毛骨悚然。

谢谢。

【问题讨论】:

  • JSLint 出于可读性原因抱怨它。你觉得这两个哪个更具可读性?阅读代码的次数远多于编写的代码。多写一行不应该让你“毛骨悚然”。
  • /*jshint -W030 */ 添加到文件顶部以删除警告,或更新您的.jshint 文件。
  • array.push 修改数组,但 array.slice 不会。 :后面的部分没有效果,你用的有原因吗?

标签: javascript if-statement shorthand


【解决方案1】:

可以像这样将三元运算符包装在void operator 中:

void(cond ? expr1 : expr2);

这样就达到了预期的结果并通过了 JSHint。请参阅JSFiddle 并单击 JSHint 按钮。

不过,我推荐以下语法:

if (cond) {
    expr1;
} else {
    expr2;
}

因为它更具可读性。仅仅因为 JavaScript 允许你做奇怪的事情并不意味着你应该这样做。

【讨论】:

    【解决方案2】:

    它抱怨的是你盗用了conditional operator。它是一个操作符而不是一个控制结构。所以它属于+,-,*,/ 之类的东西。这意味着您希望第一个操作数是布尔值,而第二个和第三个操作数会产生一个返回值。

    整个东西都是缩写

      if (boolean) {
       string ="this" ;
      } else {
       string ="that";
      }
    

    它想要返回一个值(在你的情况下它不能)并且它希望你使用那个值(你不这样做)。因此,如果您的案例不适合使用三元组,因此它的可读性会大大降低。

    【讨论】:

      【解决方案3】:

      您在表达式中使用副作用来执行逻辑。

      确实不是很友好的代码。它会起作用的。

      只需重写为与表达式不同的逻辑。

      【讨论】:

        【解决方案4】:

        您可以使用以下方法绕过 jshint 消息:

        void(boolean ? array.push("this") : array.slice("that",1));
        

        【讨论】:

          【解决方案5】:

          如果你真的想以干净的方式使用三元运算符进行这种操作,那么你可以这样做:

          array[cond ? 'push' : 'slice'](cond ? "this" : "that", cond ? 1 : undefined);
          

          array[cond ? 'push' : 'slice'].apply(null, cond ? ["this"] : ["that", 1]);
          

          但无论如何,您可能更喜欢无聊的 if 语句。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-07-02
            • 1970-01-01
            • 2021-12-09
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多