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