JavaScript运算符优先级与结合性决定表达式执行顺序:括号和一元运算符优先级最高;算术运算中**高于乘除;逻辑运算&&高于||;赋值运算全为右结合。

JavaScript 运算符种类多、用途广,但真正影响代码行为的关键,往往不是“用了哪个”,而是“谁先算、怎么连”。掌握优先级与结合性,能避开大量隐性 bug,比如 3 + 2 * 4 得 11 而非 20,a = b = 5 中 b 先被赋值,true && false || true 结果是 true——这些都不是巧合,而是规则在起作用。
运算符主要分这四类,按使用频率和逻辑层级排列
理解分类是理清优先级的前提:
-
括号与一元运算符:包括
()、++、--、!、+(一元正)、-(一元负)。它们优先级最高,尤其括号可强制改变执行顺序;自增/自减还分前置(++x)和后置(x++),影响表达式返回值。 -
算术与位运算符:如
*、/、%(乘性)高于+、-(加性);再往下是位移(、>>)、关系(、===)、相等(==、!=)等。注意:**(幂运算)优先级高于乘除,但低于一元运算符。 -
逻辑与条件运算符:
&&优先级高于||,两者都低于比较运算符;三元运算符? :优先级更低,且是右结合的,所以a ? b : c ? d : e等价于a ? b : (c ? d : e)。 -
赋值类运算符:从
=到+=、&=、??=都属于这一组,优先级最低,且全部右结合。这意味着a = b = c = 7是合法的,执行顺序是c = 7→b = c→a = b。
优先级不是靠死记,而是靠“分层验证”
遇到复杂表达式时,别硬背表格,用三层方法快速定位:
-
先找括号:所有
()内部独立计算,无视外部优先级。例如2 * (3 + 4) > 5 && !0,先算括号得7,再算2 * 7得14,再比大小、取非。 -
再看运算符类型:看到
+就问“是加法还是拼接?”;看到-就想“是减法还是取负?”;看到==就警惕类型转换。类型不同,所属层级就不同。 -
最后比结合方向:左结合(如
5 - 2 + 1→(5 - 2) + 1)按顺序算;右结合(如a = b = 1或a && b || c)从右往左连。特别注意&&和||是短路运算,不只关乎结合性,还决定是否执行右侧表达式。
日常写代码时最该盯住的三个坑
这些地方优先级容易“反直觉”,建议养成加括号的习惯:
-
逻辑混合判断:比如
if (a && b == c || d),实际是if ((a && (b == c)) || d)。若本意是(a && b) == c || d,就必须加括号,否则逻辑错位。 -
位运算与比较混用:像
a & b == c,==优先级高于&,等价于a & (b == c),几乎从来不是你想要的。应写成(a & b) == c。 -
赋值嵌套中的副作用:例如
let x = y = z++,z++先返回旧值再自增,而y和x都拿到这个旧值。如果误以为y拿到的是新值,就会出错。
一个实用练习法:用 console.log 拆解每一步
不要只看最终结果。对含多个运算符的表达式,分步打印中间值:
示例:let a = 2, b = 3, c = 4;<br>console.log(a + b * c); // 14 → 先算 b*c<br>console.log((a + b) * c); // 20 → 加括号改顺序<br>console.log(!a && b || c); // 4 → !a 是 false,false && b 是 false,false || c 是 c(4)
多练几次,大脑会自然建立“哪块先咬一口”的直觉。工具只是辅助,真正的掌握发生在你主动拆解、验证、修正的那一刻。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











