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

时间:2011-02-19 05:09:35

标签: javascript short-circuiting

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

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

我的第一个想法是wtf ??

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

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

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

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

6 个答案:

答案 0 :(得分:17)

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

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

答案 1 :(得分:10)

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

  

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

答案 2 :(得分:5)

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

false && true || true
> true

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

false && (true || true)
> false

答案 3 :(得分:1)

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

答案 4 :(得分:1)

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

答案 5 :(得分:-1)

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

  

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

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