根据MDN逻辑运算符页面:
错误&&任何东西都是短路评估为假的。
考虑到这些信息,我希望false && true || true的计算结果是错误的。然而,情况并非如此。只有当语句编写如下所示时,才会给出预期结果(false):
false && (true || true)一位同事和我试着解决这个问题,我们能想到的最接近的事情是,这个声明是按优先级进行评估的。根据MDN算子优先,logical-and比logical-or有更高的精度,这意味着条件的求值就像false && true是一条语句一样,然后由false && true确定false || true的布尔条件,然后是true。如果写出来,这将是:
(false && true) || true这里出了点问题。这要么是文档、JavaScript解析逻辑,要么是我的解释。
编辑:
我增加了一笔奖金,因为给出的答案中没有一个能真正理解这个问题。如前所述:MDN逻辑运算符页面准确地声明:"false &&任何短路都被评估为false。“
“任何”的意思是“任何”!
发布于 2014-01-28 17:03:42
你的困惑都归结于对优先权的误解。
数学模拟是“零乘以任何等于零”。请考虑以下表达式:
0 x 100 + 5在任何编程语言或一个像样的计算器中,计算值为5。“零乘以任何”公理都是正确的--但在本例中,“任何东西”都是100,而不是100 + 5!要了解原因,请将其与以下内容进行比较:
5 + 0 x 100不管您是在开头还是结尾添加5--操作符优先规则消除了语句中的歧义。
在JavaScript布尔逻辑中,&&比||具有更高的优先级。因为每个运算符都是交换性,所以编写
false && true || true和写作完全一样
true || false && true发布于 2014-01-27 16:36:33
该语言通过将表达式解析为抽象语法树来工作。表达式false && true || true被解析为以下内容:
||
/ \
&& true
/ \
false true只有在建立AST之后,才能进行短路评估.这个
错误&&任何东西都是短路评估为假的。
引号只适用于有效的子树,其中false和anything是&&节点的子树,如下所示:
&&
/ \
false true这意味着只有false && true才会得到对false的简短评估,而由此产生的false || true将被计算为true。
发布于 2014-01-25 02:23:31
你认为优先顺序是错误的。
&&是首先完成的,然后是\,所以它看起来是如何编写它的:
(false && true) || true所以MDN链接是正确的。
https://stackoverflow.com/questions/21345748
复制相似问题