AND(&&)优先于OR(||)的表达式示例是什么?

8

在我找到的所有JavaScript运算符优先级图表中(例如此链接此链接),逻辑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,因为第一个 || 甚至不会看右边。如果我在最后一个 || 中交换 03,结果仍然是 3
我尝试的最接近的方法是:
0 || false && "" || NaN

...这是 NaN,而

0 || false && ("" || NaN)

...是false,但我认为这只是由于从左到右的语义解释而不是&&优先级更高。

我可能只是忽略了它,对于哪个表达式,&&||优先级高很重要?


只是猜测:作为备选方案,也许可以使用? - maioman
4
true || false && false - Ôrel
4个回答

4
true || false && false

true

(true || false) && false

false

true || (false && false)

true


如果您使用对象而不是布尔值,则很容易看到差异。例如,{a:1} || {b:2} && {c:3} || {d:4} && {e:5} 返回 {a:1},而 ({a:1} || {b:2}) && ({c:3} || {d:4}) && {e:5} 返回 {e:5} - aroth
@aroth:除了所有对象都是真实的之外。但是使用(比如)1 || 0 && ""会使这更清晰,因为它是1,但是(1 || 0) && """" - T.J. Crowder
谢谢!这个问题困扰了我很久,我似乎找不到一个类似的例子。 - Geoff Davids

3
如果它们具有相同的优先级并且是左结合的,则例如,表达式:
1 || 0 && 2

would be

((1 || 0) && 2) // evaluates to 2

而不是

(1 || (0 && 2)) // evaluates to 1

我们从“通常”的优先级规则中获得的结构是这样的。


对于你的结构… || … && … || …(这将是(((… || …) && …) || …)而不是正常的((… || (… && …)) || …)),对于像0 0 1 0这样的值,您将获得不同的结果。


为什么逻辑AND比逻辑OR略高一些?

这样布尔表达式的规范形式,也就是析取范式,就不需要任何括号了。


1

例子:

1 || 0 && 0 -> (1 || 0) && 0 -> (1) && 0 -> 0
1 || 0 && 0 -> 1 || (0 && 0) -> 1 || (0) -> 1


0
回答这个问题代数式的方式很有趣:
(x | y) & z ≠ x | (y & z)
展开第一个括号内的项:
(x & z) | (y & z) ≠ x | (y & z)
由于 y & z 等于它自己,差异必定来自于:
x & z ≠ x
如果 x = false,则该式为假,所以 x = true,得到:
true & z ≠ true 或者
z ≠ true 因此,z = false。
将 x = true,z = false 代回原始表达式:
(true | y) & false ≠ true | (y & false)
因此,y 的任何值都会显示出差异。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接