有人能解释一下为什么JavaScript中的逻辑运算符(如“||”、“&&”)也适用于“运算符优先级”吗?

3
有人能解释一下为什么 JavaScript 中的逻辑运算符(如 || 和 &&)要使用操作符优先级吗?在如下运算中,它是什么意思?
true || false && false JavaScript 中 && 操作符比 || 操作符具有更高的优先级,因此先计算 false && false。根据我所知,JavaScript 引擎不会计算 false && false,因为在 || 操作符之前有一个 true 字面量,当 || 操作符之前的值为 true 时,|| 操作符后面的值就不会被计算,这称为“逻辑运算符的短路”;在 JavaScript 中,另一个例子将是:
true || alert()
即使函数调用的优先级高于 || 操作符,该函数调用也永远不会发生;另一个例子是:
true || x = 7
如果在 JavaScript 中逻辑运算符的短路确定为真,则上述代码不应产生错误,因为不会计算 x = 7,因为在 || 操作符之前有一个 true 字面量。

2
你有两个部分,即求值顺序和优先级。优先级表示对于 true || false && false 它等同于 true || (false && false) 而不是 (true || false) && false。你可以将优先级视为表达式生成的树如何构建,然后根据求值顺序对该树进行评估。 - t.niese
1
不是运算符的优先级顺序,而是表达式的求值顺序。您有一个带有运算符优先级的表达式,它定义了运算符和操作数的分组方式。您还有求值顺序,它定义了按照运算符优先级定义的这些分组的顺序进行求值,并且如果已经求值的部分足以知道表达式的结果,则可以提前退出。 - t.niese
1
那么对于类似 x = 7 的赋值表达式,哪个操作数会先被评估呢? - user13104441
2
我会将注释重写为答案。 - t.niese
2
这里,但我需要一些时间。由于无法编辑和合并评论,整个事情变得混乱和误导。 - t.niese
显示剩余5条评论
1个回答

7

运算符优先级仅确定分组,而非实际评估顺序:https://dev59.com/BaXja4cB1Zd3GeqPTppJ#46506130

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

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

  • true || x = 7 评估为 (true || x) = 7 并引发错误,而不是 true || (x = 7)


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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接