为什么`false && true || true` 评估为 true?

2024-02-02

根据MDN 逻辑运算符 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Logical_Operators page:

false && 任何短路评估结果为 false。

鉴于这些信息,我预计false && true || true评估为假。然而,这种情况并非如此。预期结果(false) 仅当语句写成如下形式时才会给出:

false && (true || true)

我和一位同事试图解决这个问题,我们能想到的最接近的事情是,该语句正在按优先级顺序进行评估。根据MDN 运算符优先级 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Operator_Precedence logical-and优先级高于logical-or,表明条件被评估为好像false && true是一个语句,然后继续确定布尔条件false || true那么就是true。写下来,这将是:

(false && true) || true

这里不对劲。要么是文档,要么是 JavaScript 解析逻辑,要么是我的解释。

Edit:

我添加了赏金,因为给出的答案都没有真正理解这个问题。如上所述:MDN 逻辑运算符 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Logical_Operators页面准确地指出:“假&&任何东西都被短路评估为假。”

“任何事”就是“任何事”的意思!


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

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

0 x 100 + 5

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

5 + 0 x 100

无论您在开头还是末尾添加 5 都没有关系 - 运算符优先级规则可以消除语句中的歧义。

在 JavaScript 布尔逻辑中,&&优先级高于||。由于每个操作符都是可交换的 http://en.wikipedia.org/wiki/Commutative_property, 写作

false && true || true

与写作完全相同

true || false && true
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么`false && true || true` 评估为 true? 的相关文章