在我能找到的所有 JavaScript 运算符优先级图表中(如 this one 和 this one),逻辑 AND (
&&
) 的优先级稍微高于逻辑 OR (||
)。
我似乎无法找出结果与具有相同优先级时不同的表达式。我认为一定有某种方式让它发挥作用,否则如果没有,它们将被列为具有相同的优先级。
例如:
0 || 2 && 0 || 3
是
3
,但无论我如何分割它,它总是3
:
(0 || 2) && 0 || 3
0 || (2 && 0) || 3
(0 || 2 && 0) || 3
0 || 2 && (0 || 3)
0 || (2 && 0 || 3)
如果我先做其他的
0
(比如4
),结果总是4
,因为第一个||
甚至不看右侧。如果我交换最后一个 0
中的 3
和 ||
,结果仍然是 3
。
我最接近的是
0 || false && "" || NaN
...这是
NaN
,而
0 || false && ("" || NaN)
...是
false
,但我认为这纯粹是通过从左到右的语义来解释的,而不是通过 &&
具有更高的优先级来解释。
我一定是错过了,对于什么表达式来说,
&&
比||
具有更高的优先级重要?
true || false && false
是
true
(true || false) && false
是
false
true || (false && false)
是
true
如果它们具有相同的优先级并且是左关联的,那么例如表达方式
1 || 0 && 2
会是
((1 || 0) && 2) // evaluates to 2
而不是
(1 || (0 && 2)) // evaluates to 1
我们从“通常”的优先规则中得到的。
对于您的结构
… || … && … || …
(这将是(((… || …) && …) || …)
而不是正常的((… || (… && …)) || …)
),对于像0 0 1 0
这样的值,您会得到不同的结果。
为什么逻辑 AND 的优先级略高于逻辑 OR?
因此布尔表达式的规范形式,析取范式,不需要任何括号。
示例:
1 || 0 && 0
-> (1 || 0) && 0
-> (1) && 0
-> 01 || 0 && 0
-> 1 || (0 && 0)
-> 1 || (0)
-> 1
用代数方式回答这个问题很有趣:
(x | y) & z ≠ x | (y 和 z)
展开第一个括号内的术语:
(x 和 z) | (y & z) ≠ x | (y 和 z)
由于 y & z 等于自身,因此差值必定来自:
x 和 z ≠ x
如果 x = false 那么 x = true,则为 false,给出
真 & z ≠ 真
或
z ≠ 真
所以 z = false。
将 x = true, z = false 代入原始表达式:
(真 | y) & 假 ≠ 真 | (是和假)
因此 y 的任一值都表明了差异。