首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么‘`false && true’评估为true?

为什么‘`false && true’评估为true?
EN

Stack Overflow用户
提问于 2014-01-25 02:14:29
回答 12查看 14.7K关注 0票数 5

根据MDN逻辑运算符页面:

错误&&任何东西都是短路评估为假的。

考虑到这些信息,我希望false && true || true的计算结果是错误的。然而,情况并非如此。只有当语句编写如下所示时,才会给出预期结果(false):

代码语言:javascript
复制
false && (true || true)

一位同事和我试着解决这个问题,我们能想到的最接近的事情是,这个声明是按优先级进行评估的。根据MDN算子优先logical-andlogical-or有更高的精度,这意味着条件的求值就像false && true是一条语句一样,然后由false && true确定false || true的布尔条件,然后是true。如果写出来,这将是:

代码语言:javascript
复制
(false && true) || true

这里出了点问题。这要么是文档、JavaScript解析逻辑,要么是我的解释。

编辑:

我增加了一笔奖金,因为给出的答案中没有一个能真正理解这个问题。如前所述:MDN逻辑运算符页面准确地声明:"false &&任何短路都被评估为false。“

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

EN

回答 12

Stack Overflow用户

回答已采纳

发布于 2014-01-28 17:03:42

你的困惑都归结于对优先权的误解。

数学模拟是“零乘以任何等于零”。请考虑以下表达式:

代码语言:javascript
复制
0 x 100 + 5

在任何编程语言或一个像样的计算器中,计算值为5。“零乘以任何”公理都是正确的--但在本例中,“任何东西”都是100,而不是100 + 5!要了解原因,请将其与以下内容进行比较:

代码语言:javascript
复制
5 + 0 x 100

不管您是在开头还是结尾添加5--操作符优先规则消除了语句中的歧义。

在JavaScript布尔逻辑中,&&||具有更高的优先级。因为每个运算符都是交换性,所以编写

代码语言:javascript
复制
false && true || true

和写作完全一样

代码语言:javascript
复制
true || false && true
票数 12
EN

Stack Overflow用户

发布于 2014-01-27 16:36:33

该语言通过将表达式解析为抽象语法树来工作。表达式false && true || true被解析为以下内容:

代码语言:javascript
复制
          ||
         /  \
       &&    true
      /  \
 false    true

只有在建立AST之后,才能进行短路评估.这个

错误&&任何东西都是短路评估为假的。

引号只适用于有效的子树,其中falseanything&&节点的子树,如下所示:

代码语言:javascript
复制
       &&
      /  \
 false    true

这意味着只有false && true才会得到对false的简短评估,而由此产生的false || true将被计算为true

票数 10
EN

Stack Overflow用户

发布于 2014-01-25 02:23:31

你认为优先顺序是错误的。

&&是首先完成的,然后是\,所以它看起来是如何编写它的:

代码语言:javascript
复制
(false && true) || true

所以MDN链接是正确的。

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21345748

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档