60

そのため、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

この操作の順序の完全なリストは、どこかで見つけることができればいいでしょう。ありがとう!

4

7 に答える 7

83

条件付きステートメントのすべてのユースケースの基本的に 99% をカバーする私の経験則は次のとおりです。

  1. グループ化:()
  2. 会員アクセス. or [...]
  3. いいえ:!
  4. 比較、例えば< , >= , === , !=, ...
  5. 論理積&&
  6. 論理和||

MDN は完全な内訳を提供します: Javascript Operator Precedence

あなたの例では:

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

等しい

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

上記のケースよりも複雑なものについては、とにかく読みやすさのためにコードをリファクタリングすることを検討します!

于 2012-06-22T14:10:17.057 に答える
11

優先順位については、このチャートを参照してください。

あなたのコードを次に読んだ人は、「なんてこった?それはすべきことをしているのだろうか?」と思うからです。

したがって、より良い解決策は、優先順位を知っていて、それを正しく適用してコードが機能する場合でも、用語を括弧で囲むことです

これは、できるからといってできる限りのことをするべきではないという古い知恵に従っています。常に結果に注意してください。

于 2012-06-22T14:11:25.720 に答える
3

https://developer.mozilla.org/en/JavaScript/Reference/Operators/Operator_Precedence

&&は before||であるため、式は次と同等です。

firstRun == true || (selectedCategory != undefined && selectedState != undefined)
于 2012-06-22T14:10:41.283 に答える
1

論理演算子の優先順位は実際にはECMAScript 仕様で定義されていませんが、MDNはそれをうまく処理しており、論理演算子については別のページさえ持っています。

私の懸念は、論理演算子の優先順位が ECMAScript 仕様で実際に定義されていないため、個々のブラウザー ベンダーが潜在的に異なる可能性があるためです (Internet Explorer と話しているのです!) YMMV.

さまざまなブラウザーでこれをテストしたい場合は、テスト ケースのフィドルを次に示します: http://jsfiddle.net/HdzXq/

于 2012-06-22T15:02:08.830 に答える
1

それは最初になります:

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

原則として、ほとんどのプログラミング言語で AND が優先されます

于 2012-06-22T14:11:15.300 に答える