有人能解释一下为啥“运算符优先级”适用于 javaScript 中的“||”、“&&”等逻辑运算符吗

Posted

技术标签:

【中文标题】有人能解释一下为啥“运算符优先级”适用于 javaScript 中的“||”、“&&”等逻辑运算符吗【英文标题】:Can someone explain me why "operator precedence" applies to logical operators like "||", "&&" in javaScript有人能解释一下为什么“运算符优先级”适用于 javaScript 中的“||”、“&&”等逻辑运算符吗 【发布时间】:2020-08-02 18:31:48 【问题描述】:

谁能解释一下为什么运算符优先级适用于 javascript 中的 ||&& 等逻辑运算符?这在以下操作中意味着什么:

真||假&&假

首先计算false && false,因为&& 运算符的优先级高于JavaScript 中的|| 运算符。据我所知,false && false 没有被 JavaScript 引擎评估,因为在 || 之前运算符有一个true 文字,当|| 运算符之前的东西是true 时,|| 运算符之后的东西将不会被评估这在 JavaScript 中称为“逻辑运算符的短路”,另一个示例将是:

真 || 警报()

即使函数调用的优先级高于|| 运算符,函数调用也不会发生,另一个例子是

真|| x = 7

如果 JavaScript 中逻辑运算符的短路是真的,那么上面的代码一定不会出错,因为 x = 7 没有被计算,因为在 || 运算符之前有一个 @ 987654333@ 字面量。

【问题讨论】:

你有两个部分,评估顺序和优先级。优先级表示true || false && false 等于true || (false && false) 而不是(true || false) && false。您可以将优先级视为如何构建表达式中的树,然后根据评估顺序评估此树。 所以你的意思是这里发生的事情完全是运营商"evaluation order"的影响 不是运算符的求值顺序,而是表达式的求值顺序。您有一个具有运算符优先级的表达式,它定义了运算符和操作数的分组方式。并且您有评估顺序,它定义了对运算符优先级定义的那些分组的评估顺序,以及是否有提前退出,以防已经评估的部分足以知道表达式的结果。 我会重写 cmets 作为答案。 在这里,但我需要一些时间。由于无法编辑和组合 cmets,整个事情变得混乱和误导。 【参考方案1】:

运算符优先级仅决定分组,而不是实际的评估顺序:https://***.com/a/46506130

true || false && false 变为 true || (false && false) 但仍从左到右进行评估。

true || alert() 被评估为 true || (alert()) 而不是 (true || alert)()

true || x = 7 被评估为 (true || x) = 7 并导致错误,而不是 true || (x = 7)

【讨论】:

但是如果 || 运算符的正确操作具有更高的优先级,为什么不首先评估该操作

以上是关于有人能解释一下为啥“运算符优先级”适用于 javaScript 中的“||”、“&&”等逻辑运算符吗的主要内容,如果未能解决你的问题,请参考以下文章

谁能解释为啥这适用于类组件而不是功能组件?

当运算符优先级说不应该时,为啥短路评估会起作用?

为啥 f:validateDoubleRange 仅适用于 @SessionScoped?

Python运算符优先级

有人可以解释一下,我的 mysql 匹配为啥不工作

有人可以解释为啥条件运算符和赋值运算符一起使用时表现奇怪吗?