3

私は最近、次の [効果的な] 構文構造に出くわしました。

d <= f && func3();

実際の構成は次の形式です。

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

この構成の目的は何ですか?

私の最善の推測では、演算子の短絡評価のために false を返すfunc3場合にのみ実行されますが、実際の関数のロジックがその時点で false になることを防ぐことを考えると、それは意味がないと思いますコードであり、実行されていることは DOM ウォッチングから明らかです。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

基本的に、ブール&&演算子をハッキングしています。条件のショートカットとして演算子を使用することが&&あります。||これらの演算子の動作により、これが可能になります。

  • &&は、第1オペランドが真の場合にのみ、第2オペランドをチェックtrue && thisWillAlwaysBeExecuted()します。false && thisWillNeverBeExecuted
  • || 演算子は、最初のオペランドがfalseの場合にのみ、2番目のオペランドをチェックtrue || thisWillNeverBeExecuted()します。false || thisWillAlwaysBeExecuted()

それは意図を隠すので、それは悪い習慣だと思います。その式の意味は、「これら2つのオペランドを比較する」であり、意図は「特定の条件が満たされた場合-このタスクを実行する」です。パフォーマンスが向上するかどうかは本当に疑わしいです。最初のIDEが発明されたとき、「文字数が少ない」という議論は機能しなくなりました。

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

d以上fですか?trueの場合、

a > b ? func1() : func2()

ですかa > b?trueの場合、を実行しますfunc1()。trueでない場合は、を実行しfunc2()ます。

dを超えていない場合はf

d <= f && func3();

d以下の場合はf、を実行しますfunc3()

編集

使用の目的に関して&&は、通常、条件ステートメントの後半部分を実行することを避けたい場合に実行され、前の条件&&がfalseの場合は本質的に中断します。通常、これらは、存在しないプロパティが、そのプロパティまたはその存在を保証する機能をテストすることによってアクセスされないようにするために使用されます。

于 2013-01-09T21:40:24.233 に答える
0

または のいずれdfが非数値 ( NaN、数値以外の文字列など) の場合、 と の両方をテストd > fしてd <= fを返すことができfalseます。

だからコードで

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

一見冗長に見えますが、 orが非数値の場合d <= f、実行をショートさせてしまいます。func3df

醜いコード!

于 2013-01-09T22:08:50.193 に答える