使用 && 的短路作为 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 语句?的主要内容,如果未能解决你的问题,请参考以下文章