12

そこで、Google Closure Compiler を試してみましたが、変数が常に比較の右側にあるように、すべての等価パラメーターが切り替えられることに気付きました。

いくつかの例のように、代わりに I have と I have instead of を使用typeof XMLHttpRequest=="undefined""undefined"==typeof XMLHttpRequestますif(null!==a)if(a!==null)

彼らが同じことを達成していることは知っていますが、それは私が慣れ親しんだスタイルではありません. これらを切り替えることで得られる何らかの利点はありますか? どうなるかわかりません。

Closure Compilerがこれを行うことを決定した理由を誰かが説明できますか? Closureのその部分を書いた人の好みですか?

編集:明確にするために、人々はなぜそれが良いコーディングプラクティスと見なされるのかを私に話しています. それは問題ありませんが、これはコンパイル後です。パフォーマンス上の利点はありますか、それとも Closure Compiler は要点を証明しようとしているだけですか?

4

6 に答える 6

12

C / C++ などの言語で一般的に行われるため、誤って行うことはできません

if (a = null) {
    // sets a to null and everyone is happy.
    // but probably meant to check if a is null or not.
    // via (a == null)
}

if (null = a) {
    // won't compile
}
于 2012-11-16T01:42:33.347 に答える
11

コンパイラは非常に単純な理由で順序を切り替えます: gzip を使用すると圧縮率が向上します。コンパイラは、理解度を向上させたり、編集を容易にしたりすることは気にしません。「if (x == null) ... if (y == null) ...」などの一般的な比較の順序を入れ替えることで、「if (null == x) ... if (null == y) 」になります。 .." Gzip は "if (null ==" を検出し、それを 1 つのトークンに置き換えることができます。大きな改善ではありませんが、コード ベースが大きくなります。

于 2012-11-16T06:06:15.143 に答える
3

私が知っている理由は、防止するために行われます

if (x = 5) { }

逆にすると

if (5 = x) { }

コンパイラ エラーが発生します。

しかし、次のように書くと

if (5 == x) { }

それはうまくコンパイルされます。

于 2012-11-16T01:44:02.943 に答える
3

はい、定数に代入することはできず、==タイプミスが発生しやすいです (忘れて を使用する場合もあります=)。

たとえば、どのような違いがありますか...

if (a == 1) { }

...と...

if (a = 1) { }

? 2 番目のものは、 の値に関係なく、常にtrueaと評価されます。

LHS と RHS をひっくり返すと、すぐにメリットがわかります...

if (1 == a) { }

...期待どおりに動作し、...

if (1 = a) { }

...定数に代入できないため、失敗します。

于 2012-11-16T01:41:51.050 に答える
1

よくある間違いの特定のケースの静的分析の安価な代替品/

于 2012-11-16T04:40:57.853 に答える
1

私の脳は解析します

if( x < y )

よりわずかに速い

if( y > x )

おそらく、実軸が常に左から右に向いているため、状態が視覚化されやすくなっています。

ただし、Javaでは、次のように書く方が実用的です

if( "string".equals(x) ) {...

「より自然」とは対照的に

if( x.equals("string") ) {...

NPEの機会を排除します。

于 2012-11-16T01:49:26.160 に答える