3

我最近遇到了以下 [有效] 句法结构:

d <= f && func3();

实际构造的形式为:

d > f ? a > b ? func1() : func2() : d <= f && func3();

这个构造的目的是什么?

我最好的猜测是,由于运算符中的短路评估,只有在返回错误func3时才会执行,但我认为这是没有意义的,因为实际函数中的逻辑将防止在该点永远为假代码,从正在执行的 DOM-watching 中可以清楚地看到d <= f&&d <= ffunc3

如果您想查看整个代码,我在http://cdn.sstatic.net/js/full.js?v=9358063bfb40中找到了它,由函数中的https://stackoverflow.com/faq引用moveScroller(完整功能下面,它在d <= f && j.css({...})必须重置回相对位置的行中)。

function moveScroller() {
    var g = $("#scroller").width(),
        d = function () {
            var d = $(window).scrollTop(),
                f = $("#scroller-anchor").offset().top,
                j = $("#scroller");
            d > f ? j.height() > $(window).height() ? j.css({
                position: "fixed",
                top: "",
                bottom: "0px",
                width: g
            }) : j.css({
                position: "fixed",
                top: "0px",
                bottom: "",
                width: g
            }) : d <= f && j.css({
                position: "relative",
                top: "",
                bottom: ""
            })
        };
    $(window).scroll(d).resize(d);
    d()
}
4

4 回答 4

3

正如您所猜测的,它的含义几乎与

if (var1 <= var2) someFunction();

这并不意味着完全相同。该if语句是一个语句,而该&&构造只是一个表达式(因此可能是更大表达式的一部分)。

编辑-我现在同意,因为该代码位于?:运算符的“else”翼中,因此“d”必须小于或等于“f”。也许它是为了澄清事情而写的,但我觉得该代码的作者对清晰性不太感兴趣。

于 2013-01-09T21:34:58.490 回答
2

它基本上是在破解布尔 && 运算符。人们有时使用&&||运算符作为条件的快捷方式。这是可能的,因为这些运算符的行为:

  • && 将仅在第一个操作数为真时检查第二个操作数,例如true && thisWillAlwaysBeExecuted()false && thisWillNeverBeExecuted
  • || 运算符仅在第一个操作数为假时检查第二个操作数,例如true || thisWillNeverBeExecuted()false || thisWillAlwaysBeExecuted()

我认为这是一种不好的做法,因为它隐藏了意图。该表达式的意思是:“比较这两个操作数”,意图是“如果满足某些条件 - 执行此任务”。我真的怀疑性能是否有任何提升,并且当第一个 IDE 被发明时,“它的字符更少”的论点停止了工作。

于 2013-01-09T21:46:41.527 回答
1
d > f ? a > b ? func1() : func2() : d <= f && func3();

d超过f?如果是真的那么

a > b ? func1() : func2()

a > b吗?如果为真,则运行func1()。如果不是真的,那么运行func2()

如果d不超过f,那么

d <= f && func3();

如果d小于或等于f,运行func3()

编辑

至于使用&&它的目的,通常是在您想要避免执行条件语句的后面部分时完成,并且如果之前的条件&&为假,则基本上会中断。通常这些用于确保不存在的属性不会通过测试它或保证其存在的特性来访问。

于 2013-01-09T21:40:24.233 回答
0

如果其中一个df是非数字(NaN,非数字字符串等),则两者都测试d > f并且d <= f可以返回false

所以在代码中

d > f ? a > b ? func1() : func2() : d <= f && func3();

乍一看,它看起来d <= f是多余的,但它会缩短func3ifd或非f数字的执行。

丑陋的代码!

于 2013-01-09T22:08:50.193 回答