論理 AND および OR 演算子は、三項条件演算子とともに JavaScript で唯一の遅延演算子です。これらは、次の規則を使用して短絡評価のためにテストされます。
false && anything === false
true || anything === true
これは、Haskell での実装と同じ方法です。
(&&) :: Bool -> Bool -> Bool
False && _ = False
True && x = x
(||) :: Bool -> Bool -> Bool
True || _ = True
False || x = x
ただし、MDN によると、JavaScript の論理演算子は結合のままです。これは直感に反します。私の謙虚な意見では、それらは右結合でなければなりません。Haskell は正しいことを行います。Haskell の論理演算子は右結合です。
infixr 3 &&
infixr 2 ||
Haskell で次の式を考えてみましょう。
False && True && True && True
は Haskell では右結合であるため&&
、上記の式は次と同等です。
False && (True && (True && True))
(True && (True && True))
したがって、式が何に評価されるかは問題ではありません。最初False
の式により、式全体がFalse
1 つのステップで縮小されます。
&&
を連想のままにしておくとどうなるかを考えてみましょう。式は次のようになります。
((False && True) && True) && True
式全体を評価するには、3 つの削減が必要になります。
((False && True) && True) && True
(False && True) && True
False && True
False
ご覧のとおり、論理演算子は右結合である方が理にかなっています。これは私の実際の質問に私をもたらします:
JavaScript の論理演算子が左結合であるのはなぜですか? ECMAScript 仕様は、これについて何を述べているのでしょうか? JavaScript の論理演算子は実際に右結合ですか? MDN ドキュメントには、論理演算子の結合性に関する誤った情報がありますか?
編集:仕様によると、論理演算子は結合されたままです:
LogicalANDExpression = BitwiseORExpression
| LogicalANDExpression && BitwiseORExpression
LogicalORExpression = LogicalANDExpression
| LogicalORExpression || LogicalANDExpression