JavaScript运算符优先级问题:复杂混合赋值语句执行逻辑求解
问题核心原因
你对JavaScript运算符优先级和逻辑或短路规则的理解存在偏差,导致预期结果和实际运行结果不符,具体执行逻辑如下:
初始化代码
// setup var n = 3; var J = 3; var g = 0; var p = 41; var m = false; var O = 22; var z = 15; var I = [7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,21,19,20,22,18,20,19,21,7,7,17,17,17,17,17,17,17,17,7,7,0,0,0,0,0,0,0,0,7,7,0,0,0,0,0,0,0,0,7,7,0,0,0,0,0,0,0,0,7,7,0,0,0,0,0,0,0,0,7,7,25,25,25,25,25,25,25,25,7,7,29,27,28,30,26,28,27,29,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,,,22]
待分析语句
n += J || (g = p, m = p < O ? g - 3 : g + 2, I[m] < z | I[m + O - p] || I[p += p - O]) ? 1 : 0;
执行顺序拆解
首先列出本题涉及的运算符优先级(从高到低排列,优先级越高越先执行):
- 逻辑或(
||)> 条件运算符(?:)> 加法赋值运算符(+=) - 额外规则:
||是短路运算符,只要左侧操作数为真值,就直接返回左侧值,不会执行右侧的任何代码。
分步执行
- 首先根据优先级拆分语句结构:
+=优先级最低,所以原式等价于n = n + ( (J || 括号内的复杂表达式) ? 1 : 0 ) - 计算
J || 括号内的复杂表达式的值:J的初始值为3,属于JS中的真值,因此逻辑或直接短路,括号内的所有赋值、比较运算代码完全不会执行,该部分结果为3。 - 计算条件运算符的结果:用上面得到的3作为判断条件,
3 ? 1 : 0的返回值为1。 - 执行最终的加法赋值:n的初始值为3,3 + 1 = 4,因此最终n的值为4。
之前理解的错误点
你错误地将运算顺序理解为n += ( J || (括号内表达式 ? 1 : 0) ),认为会先算括号内的三目运算得到1,再计算3||1=3,最后得到3+3=6。这个理解不符合JS的优先级规则:||的优先级高于?:,会先完成逻辑或的计算,再用逻辑或的结果作为三目运算的判断条件。
内容的提问来源于stack exchange,提问作者LattePrincess
相关产品推荐
相关产品推荐

