2012-06-22 19 views
26

したがって、私は、if-else文で論理演算子を使ってやや複雑な演算を書いています。私はかっこをすることができることを知っている、そして、これを行うより良い方法だと分かっているが、私は好奇心を得ているので、私は尋ねるつもりだ。もし私がこのようなことをしたら:どの論理演算子が優先順位を取るか

if (firstRun == true || selectedCategory != undefined && selectedState != undefined) { 
//Do something 
} else { 
//Do something else 
} 

かっこを使わないでどのように動作させるのですか?私は、PEMDASに似て、論理演算子の操作の順序があることを知っていますよね? 「OR」演算子の代わりに優先され、それは次のように起こって終わる場合

firstRun == true || (selectedCategory != undefined && selectedState != undefined) 

または多分::完全なリストを

(firstRun == true || selectedCategory != undefined) && selectedState != undefined 

でしょう、それはこのような何かを実行することがあります場合、私は好奇心が強いですあなたがどこかでそれを見つけることができれば、これのための操作の順序がいいです。ありがとう!条件文のために基本的にすべてのユースケースの99%をカバーして親指の

答えて

44

私のルールは、次のとおりです。

  1. グループ:()
  2. メンバーアクセス. or [...]
  3. ない:!
  4. の比較、例えばあなたの例のためにそうJavascript Operator Precedence

    (firstRun == true || selectedCategory != undefined && selectedState != undefined) 
    

    に等しい論理< , >= , === , !=, ...
  5. &&
  6. 論理OR ||

MDNはあなたに徹底的な内訳を提供します

上記のケースよりも複雑なものについては、私は可読性のためにコードをリファクタリングすることを検討します。

+0

正確に何が必要でしたか。ありがとう – JTApps

+0

'new'はどうですか?メンバのアクセスと関数の呼び出しと同じ優先順位があるので、私はそれが左から右に向いていると仮定します。 'new Foo()。bar()'は '(new Foo())。bar()'と同じですか? 'new Foo()(3)'は '(new Foo())(3)'と同じですか? – chharvey

1

:ほとんどのプログラミング言語での一般的なルールとして

firstRun == true || (selectedCategory != undefined && selectedState != undefined) 

と優先順位が高い

7

this chart for precedenceを参照してください。

あなたのコードを読んでいる次の人が「WTF?それは何をすべきか?」と思うので、何が起こるのか説明しません。「

だから、より良い解決策は、あなたが優先権を知っていても、カッコに用語をラップすることです、コードは

これは、あなたがすべてを行うべきではない古い知恵を、以下の作品正しくそれを適用あなたがそれを行うことができますので、あなただけ。必ず結果に目を維持することができます。

+0

+1はカッコの使用をアドバイスしています。 – geekchic

+0

ええ、私はあなたが言っていることを理解しています、私は認識しています、私のために求めている点は、何よりも個人的な知識のためでした。ありがとう – JTApps

1

を論理演算子の優先順位が実際にECMAScript Specificationで定義されていないものの、MDNはそれのかなり良い仕事をしてもLogical Operatorsための別のページがあります。

私の考えECMAScript仕様では論理演算子の優先順位が実際には定義されていないため、個々のブラウザのベンダーが異なる可能性があります(私はあなたとInternet Explorerを話しています)ので、YMMVです。これに親指のかなり良いルールがありhttp://jsfiddle.net/HdzXq/

6

:イベント、誰もが異なるブラウザ間でこれをテストしたい、ここでテストケースフィドルは年代に

OR

    • ANDは、乗算(例えば0 * 1 = 0 => FALSE。)である(例えば0 + 1 = 1 => TRUE。)追加され

    をあなたはこれを覚えているときに、あなたが知っているすべての数学的なもののように、これらの演算子を考えますの前に常に乗算がになるということです。

    +1

    これは、結果として得られるビットの値と同様に、優先順位の面で、実際には本当に素晴らしいニーモニックです。 – Christoph

    関連する問題