疑問
JavaScriptで条件式を3つ並べたとき括弧を省略できる?
JavaScript
if (flag_a) {
if (flag_b || flag_c) { }
}
をリファクタリングしたとき
JavaScript
if (flag_a && (flag_b || flag_c)) { }
中の括弧を省略できるかという疑問。
調査
括弧を省略できるか書き出してみた。
a | b | c | a&&b||c | (a&&b)||c | a&&(b||c) | a||b&&c | (a||b)&&c | a||(b&&c) |
---|---|---|---|---|---|---|---|---|
1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
1 | 1 | 0 | 1 | 1 | 1 | 1 | 0 | 1 |
1 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
1 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 1 |
0 | 1 | 1 | 1 | 1 | 0 | 1 | 1 | 1 |
0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
0 | 0 | 1 | 1 | 1 | 0 | 0 | 0 | 0 |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
括弧の有無で計算結果が変わるので括弧を外せない。
||より&&のほうが優先的に計算される。
演算子の優先順位 - JavaScript | MDNによると20個の規則がある。
しかし、20個も覚えてられない。
演算子の優先順位は言語によって変わるかもしれない。
たとえば、滅多にない例だが、JavaScriptでは!0 === 1
がfalse
になるが、Pythonではnot 0 == 1
がTrue
になる。
結論
リファクタリングしないか、var flag_b_or_c = flag_b || flag_c
と説明変数を挟むことがリーダブルコード。
そこはリーダブルコードにしなくていいと判断したら、括弧の有無で計算結果が変わらなかったとしても、演算子の括弧を省略しないことがリーダブルコード。