Kyl*_*ner 4 javascript logic short-circuiting
false &&任何短路评估为假.
鉴于此信息,我希望false && true || true评估为假.然而,这种情况并非如此.false只有在语句写成时才会给出预期的结果():
false && (true || true)
Run Code Online (Sandbox Code Playgroud)
一位同事和我试图解决这个问题,我们可以提出的最接近的事情就是按照优先顺序评估该声明.根据MDN运算符优先级 logical-and在具有较高precidence logical-or,表明仿佛评估条件false && true是一个单一语句,它然后移动到确定的布尔条件的false || true,然后将其true.写出来,这将是:
(false && true) || true
Run Code Online (Sandbox Code Playgroud)
这里不对劲.它是文档,JavaScript解析逻辑或我的解释.
我添加了赏金,因为没有给出的答案真正理解这个问题.如上所述:MDN Logical Operators页面准确说明:"false &&将任何短路评估为false."
BJ *_*ers 10
你的困惑都归结为对优先权的误解.
数学模拟将是"零乘以任何等于零".请考虑以下表达式:
0 x 100 + 5
Run Code Online (Sandbox Code Playgroud)
在任何编程语言或一个体面的计算器中,这个评估为5."零时任何事物"公理是正确的 - 但在这种情况下100,"任何东西"都是,不是100 + 5!要了解原因,请将其与此进行比较:
5 + 0 x 100
Run Code Online (Sandbox Code Playgroud)
无论是在开头还是结尾添加5都没关系 - 运算符优先级规则从语句中删除歧义.
在JavaScript布尔逻辑中,&&优先级高于||.由于每个操作员都是可交换的,所以写作
false && true || true
Run Code Online (Sandbox Code Playgroud)
和写作完全一样
true || false && true
Run Code Online (Sandbox Code Playgroud)
你正在看优先级错误.
&&首先完成,然后是|| 所以你看起来是怎么写的:
(false && true) || true
Run Code Online (Sandbox Code Playgroud)
所以MDN链接是正确的.
该语言通过将表达式解析为抽象语法树来工作.您的表达式false && true || true被解析为:
||
/ \
&& true
/ \
false true
Run Code Online (Sandbox Code Playgroud)
只有在建立AST之后,才能进行短路评估.该
false &&任何短路评估为假.
quote仅适用于有效的子树,其中false和anything是&&节点的子树,如下所示:
&&
/ \
false true
Run Code Online (Sandbox Code Playgroud)
这意味着只false && true评估得到的短路false并且false || true评估结果true