使用 && 的短路作为 if 语句?

IT技术 javascript short-circuiting
2021-01-17 16:53:26

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

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

我的第一个想法是wtf??

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

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

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

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

6个回答

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

另请参阅有人可以解释 John Resig 的 Pretty.js JavaScript 是如何工作的吗?

我试图用 java 像这样短路,但似乎语言不允许这样做。我对么?
2021-03-16 16:53:26
@MaxG Java 肯定有布尔运算符的短路,它只是不允许您将它们用作语句。
2021-03-27 16:53:26
@DarylBennett 有---“AndAlso”和“OrElse”。我想说现在就杀了我,但是没有脉搏已经是编程 VB 的先决条件。
2021-04-05 16:53:26
VBA 中没有短路,经过 4 个小时的调试,我艰难地学到了这一点。
2021-04-06 16:53:26

这是标准的,但既不的JSLint也不JSHint喜欢它:

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

您必须小心,因为如果||条件中有一个则可以绕过此短路

false && true || true
> true

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

false && (true || true)
> false
那是因为当它们并排时,AND 优先于 OR。等效的数学情况是2*3+2 = 82*(3+2) = 10. 这太容易错过了......
2021-03-26 16:53:26
明确而不是聪明,并使用 if 语句......你的大脑会感谢你。
2021-03-27 16:53:26

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

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

这肯定不是 C# 中的标准做法。事实上它甚至不会编译“只有赋值、调用、递增、递减和新对象表达式可以用作语句”
2021-03-23 16:53:26
本章的重点是短路是替换 if 语句 - 除了 bool 之外,if 究竟能返回什么?
2021-03-24 16:53:26
你需要把它放在括号里并赋值。仅针对您,我将删除有关 C# 的部分内容,因为该问题专门针对 JavaScript。
2021-03-31 16:53:26
只有当第二半返回时,bool您才会得到“&& 运算符不能应用于'bool'和'[任何类型的第二半返回]`类型的参数”
2021-04-03 16:53:26
问题不在于短路如何工作。它专门针对副作用而不是布尔逻辑使用短路布尔运算符。我上面给出的示例中没有发生任何分配。
2021-04-12 16:53:26