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

问题描述 投票:27回答:6

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

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

我的第一个想法是wtf ??

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

我不是一个Javascript大师,所以我的问题是2倍。首先,我想确认我理解正确。以上行是否相当于:

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

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

javascript short-circuiting
6个回答
17
投票

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

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


10
投票

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

期望一个赋值或函数调用,而是看到一个表达式。


5
投票

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

false && true || true
> true

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

false && (true || true)
> false

1
投票

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


1
投票

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


-1
投票

默认情况下,它会触发jshint警告:

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

不过个人而言,我更喜欢短路版本,它看起来更具说服力并且“控制逻辑较少”,但可能是一种误解。

© www.soinside.com 2019 - 2024. All rights reserved.