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

Posted

技术标签:

【中文标题】使用 && 的短路作为 if 语句?【英文标题】:Using &&'s short-circuiting as an if statement? 【发布时间】: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 专家。 相关Does JavaScript have short-circuit evaluation? 【参考方案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】:

这是标准的,但JSLint 和 JSHint 都不喜欢它:

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

【讨论】:

【参考方案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]

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

【讨论】:

以上是关于使用 && 的短路作为 if 语句?的主要内容,如果未能解决你的问题,请参考以下文章

C# 是不是使用 await 对 if 语句执行短路评估?

if语句中的Javascript短路

JAVASE知识-03(运算符&if语句)

js短路语句

c语言if语句多个条件怎么写?

循环语句