そのため、if-elseステートメントで論理演算子を使用して、もう少し複雑な操作を作成することを検討しています。かっこができることは知っていますし、これがより良い方法であることは知っていますが、好奇心が強くなってきたので、お尋ねします。私がこのようなことをするとしたら:
if (firstRun == true || selectedCategory != undefined && selectedState != undefined) {
//Do something
} else {
//Do something else
}
括弧を使用せずにどのように動作しますか? PEMDASに似た、論理演算子の操作の順序があることを知っていますか?このようなものが実行されるかどうか興味があります:
firstRun == true || (selectedCategory != undefined && selectedState != undefined)
または、代わりに 'OR'演算子が優先され、最終的に次のようになる場合:
(firstRun == true || selectedCategory != undefined) && selectedState != undefined
どこかで見つけることができれば、このための操作の順序の完全なリストは素晴らしいでしょう。ありがとう!
私の経験則は、基本的に条件文のすべてのユースケースの99%をカバーしています:
()
. or [...]
!
< , >= , === , !=, ...
&&
||
MDNは完全な内訳を提供します: Javascript Operator Precedence
あなたの例のために:
(firstRun == true || selectedCategory != undefined && selectedState != undefined)
等しい
(firstRun == true) || ((selectedCategory != undefined) && (selectedState != undefined))
上記のケースよりも複雑なものについては、とにかく読みやすさのためにコードをリファクタリングすることを検討します!
これにはかなり良い経験則があります。これらの演算子は数学的なものと考えてください。
AND
は乗算です(例:0 * 1 = 0 => FALSE
)OR
が追加されています(例:0 + 1 = 1 => TRUE
)これを覚えているとき、知っておくべきことは、乗算は常にbefore加算になることです。
優先順位についてはこの表 を参照してください。
あなたのコードを読んでいる次の人が「WTF?それはそれをすべきか?」と考えるので、私は何が起こるかを説明するつもりはありません。
したがって、より良い解決策は、用語を括弧で囲むことです優先順位がわかっていても、正しく適用しandコードが機能する
これは、できるからといってすべてを行うべきではないという古い知恵に基づいています。常に結果に注意してください。
https://developer.mozilla.org/en/JavaScript/Reference/Operators/Operator_Precedence
&&
は||
の前にあるため、式は次と同等です。
firstRun == true || (selectedCategory != undefined && selectedState != undefined)
論理演算子の優先順位は、実際には ECMAScript仕様 で定義されていませんが、 [〜#〜] mdn [〜#〜] はかなり良い仕事をし、さらに別の 論理演算子 のページ。
私の懸念は、論理演算子の優先順位はECMAScript仕様で実際に定義されていないので、個々のブラウザーベンダーは異なる可能性があるためです(Internet Explorer!)YMMV。
さまざまなブラウザでこれをテストしたい人のために、テストケースのフィドルを次に示します。 http://jsfiddle.net/HdzXq/
それが最初になります:
firstRun == true || (selectedCategory != undefined && selectedState != undefined)
ほとんどのプログラミング言語の一般的なルールとして、より高い優先順位を持っています