javascript - 为什么 `false && true || true` 评估为真?

标签 javascript logic short-circuiting

根据 MDN Logical Operators页:

false && anything is short-circuit evaluated to false.

鉴于此信息,我希望 false && true || true 评估为 false。然而,这种情况并非如此。预期结果 (false) 仅在如下语句编写时给出:

false && (true || true)

我和一位同事已经尝试解决这个问题,我们能想到的最接近的事情是按照优先顺序评估语句。根据MDN Operator Precedence logical-andlogical-or 具有更高的优先级,这表明条件的评估就像 false && true 是单个语句一样,这然后继续确定 false || 的 bool 条件true 然后是 true。写出来,这将是:

(false && true) || true

这里有问题。它要么是文档,要么是 JavaScript 解析逻辑,要么是我的解释。

编辑:

我添加了赏金,因为给出的答案都没有真正理解这个问题。如上所述:MDN Logical Operators页面准确地指出:“false && 任何短路评估为 false。”

“anything”就是“任何东西”!

最佳答案

你的困惑都归结为对优先级的误解。

一个数学类比是“零乘以任何等于零”。考虑以下表达式:

0 x 100 + 5

在任何编程语言或像样的计算器中,它的计算结果为 5。“零乘以任何”公理是正确的 - 但在这种情况下“任何”是 100,而不是 100 + 5!要了解原因,请将其与此进行比较:

5 + 0 x 100

在开头或结尾添加 5 并不重要 - 运算符优先级规则消除了语句中的歧义。

在 JavaScript bool 逻辑中,&& 的优先级高于 ||。由于每个运算符都是 commutative , 写作

false && true || true

和写作完全一样

true || false && true

关于javascript - 为什么 `false && true || true` 评估为真?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21345748/

相关文章:

prolog - 在 Prolog 中递归后返回一个值

algorithm - 我想添加一些精细的速度范围并将它们保存到数据库中

javascript - 确定数组是否包含值并更新或创建它

list - 使用部分函数短路列表映射

python - Python的短路有什么值(value)?

Javascript - 不排序的排序

javascript - 如何让这样的代码在 JsFiddle.net 中运行?

javascript - 使用 Google Feed API 的 jQuery 自动 RSS Feed 列表不起作用

java - 在 Java 中使用短路评估进行编程

javascript - XHR 请求的 CSRF 预防