我最近遇到了以下[有效]语法结构:
d <= f && func3();
实际构造的形式为:
d > f ? a > b ? func1() : func2() : d <= f && func3();
此构造的目的是什么?
我最好的猜测是func3
只会在d <= f
由于&&
运算符中的短路评估而返回falsy时执行,但我不认为这是有道理的鉴于实际函数中的逻辑会阻止d <= f
在代码中的那一点变为假,并且从DOM观察中可以清楚地看到正在执行func3
。
如果您想查看整个代码,我在http://cdn.sstatic.net/js/full.js?v=9358063bfb40中https://stackoverflow.com/faq在moveScroller
函数中引用了{{3}}中找到了这个代码(下面的完整函数,它在{{3}}行中{{3}} 1}}重置回相对位置。)
d <= f && j.css({...})
答案 0 :(得分:3)
正如你猜测的那样,它意味着与
几乎相同if (var1 <= var2) someFunction();
这并不意味着完全同样的事情; if
语句是一个语句,而&&
构造只是一个表达式(因此可能是更大表达式的一部分)。
编辑 - 我现在同意,因为该代码位于?:
运算符的“else”翼中,“d”必须小于或等于“f” 。也许它是用这种方式来澄清事物,但我觉得该代码的作者对清晰度不太感兴趣。
答案 1 :(得分:2)
它基本上是黑客攻击布尔&amp;&amp;运营商。人们有时会使用&&
和||
运算符作为条件的快捷方式。这是可能的,因为这些运算符的行为:
true && thisWillAlwaysBeExecuted()
和false && thisWillNeverBeExecuted
true || thisWillNeverBeExecuted()
和false || thisWillAlwaysBeExecuted()
我认为这是一种不好的做法,因为它隐藏了意图。该表达式的含义是:“比较这两个操作数”,意图是“如果满足某些条件 - 执行此任务”。我真的怀疑性能有任何好处,而且当第一个IDE被发明时,“它不是很少的字符”的论点就停止了。
答案 2 :(得分:1)
d > f ? a > b ? func1() : func2() : d <= f && func3();
d
是否超过f
?如果是,那么
a > b ? func1() : func2()
a > b
?如果为true,则运行func1()
。如果不是,则运行func2()
。
如果d
不超过f
,那么
d <= f && func3();
如果d
小于或等于f
,请运行func3()
修改的
关于使用&&
的目的,通常在你想避免做条件语句的后面部分时完成它,如果&&
之前的条件是假的话,基本上就会中断。通常这些用于确保不存在的属性不是通过测试它或者保证它存在的特征来访问的。
答案 3 :(得分:0)
如果d
或f
为非数字(NaN
,非数字字符串等),则d > f
和d <= f
都可以返回false
。
所以在代码中
d > f ? a > b ? func1() : func2() : d <= f && func3();
乍一看,d <= f
似乎是多余的,但如果func3
或d
为非数字,则会导致f
的执行短路。< / p>
丑陋的代码!