логические операторы AND и OR являются единственными ленивыми операторами в JavaScript вместе с тройной условный оператор. Они протестированы для в соответствии с логическими операторами MDN в JavaScript остаются ассоциативными. Это счетчик интуитивно понятен. По моему скромному мнению, они должны быть правильными ассоциативными. Хаскелл поступает правильно. Логические операторы в Haskell являются правильными ассоциативными:
infixr 3 &&
infixr 2 ||
Рассмотрим следующее выражение в Haskell:
False && True && True && True
Поскольку &&
является правильным ассоциативным в Haskell, указанное выше выражение эквивалентно:
False && (True && (True && True))
Следовательно, не имеет значения, что оценивает выражение (True && (True && True))
. Из-за первого False
все выражение сводится к False
за один шаг.
Теперь рассмотрим, что произойдет, если &&
оставлено ассоциативным. Выражение будет эквивалентно:
((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