【问题标题】:Using &&'s short-circuiting as an if statement?使用 && 的短路作为 if 语句?
【发布时间】:2011-06-30 06:12:18
【问题描述】:

我在jQuery.form.js源代码中看到了这一行:

g && $.event.trigger("ajaxComplete", [xhr, s]);

我的第一个念头是 wtf??

我的下一个想法是,我无法决定这是丑陋还是优雅。

无论如何,我都不是 Javascript 专家,所以我的问题是 2 倍的。首先,我想确认我理解正确。上面的行是否等同于:

if (g) {
    $.event.trigger("ajaxComplete", [xhr, s]);
}

其次,这是 Javascript 中常见/公认的做法吗?一方面它很简洁,但另一方面如果你以前没有看过它可能会有点神秘。

【问题讨论】:

标签: javascript short-circuiting


【解决方案1】:

是的,你明白(在那种情况下);是的,这是 JavaScript 的标准做法。

【讨论】:

  • 这肯定不是 C# 中的标准做法。实际上它甚至不会编译“只有赋值、调用、递增、递减和新对象表达式可以用作语句”
  • 只有当第二部分返回bool 否则你会得到“&& 运算符不能应用于'bool'类型的参数和'[无论第二部分返回什么类型]`”
  • 你需要把它放在括号中并赋值。只是为了你,我将删除关于 C# 的部分,因为这个问题专门针对 JavaScript。
  • 关键是短路是为了替换 if 语句 - 除了 bool 之外,if 返回的究竟是什么?
  • 问题不在于短路的工作原理。它专门针对副作用而不是布尔逻辑使用短路布尔运算符。我上面给出的示例中没有发生分配。
【解决方案2】:

是的,它相当于您写的if。这当然不是一种罕见的做法。是否被接受取决于谁在(或不是)接受...

【讨论】:

    【解决方案3】:

    是的,你的两个例子是等价的。它在几乎所有语言中都是这样工作的,但在 Javascript 中变得相当地道。我个人认为这在某些情况下很好,但在其他情况下可能会被滥用。不过它肯定更短,这对于最小化 Javascript 加载时间很重要。

    另见Can somebody explain how John Resig's pretty.js JavaScript works?

    【讨论】:

    • VBA中没有短路,我在调试4小时后才学会的。
    • 我尝试过使用 java 进行这样的短路,但似乎语言不允许这样做。我说的对吗?
    • @DarylBennett 有---“AndAlso”和“OrElse”。我想说现在杀了我,但没有脉搏已经是编程 VB 的先决条件。
    • @MaxG Java 肯定有布尔运算符的短路,它只是不允许您将它们用作语句。
    【解决方案4】:

    这是标准的,但JSLintJSHint 都不喜欢它:

    预期的是赋值或函数调用,但看到的是表达式。

    【讨论】:

      【解决方案5】:

      您必须小心,因为如果条件中有||,则可以绕过这种短路:

      false && true || true
      > true
      

      为避免这种情况,请务必将条件分组:

      false && (true || true)
      > false
      

      【讨论】:

      • 这是因为 AND 在并排时优先于 OR。当2*(3+2) = 10 时,等效的数学情况是2*3+2 = 8。这太容易错过了......
      • 要明确而不是 claver 并使用 if 语句......你的大脑会感谢你。
      【解决方案6】:

      默认会触发jshint警告:

      [jshint] 期望一个赋值或函数调用,但看到的是一个表达式。 (W030) [W030]

      但就个人而言,我更喜欢短路版本,它看起来更具声明性并且“控制逻辑更少”,但可能是一种误解。

      【讨论】:

        猜你喜欢
        • 2021-08-20
        • 2013-02-15
        • 2017-08-23
        • 2016-03-26
        • 2013-09-11
        • 2019-10-18
        • 1970-01-01
        • 1970-01-01
        • 2015-02-13
        相关资源
        最近更新 更多