JavaScript运算符优先级应按三层结构理解:第一层为括号、点号等单值操作,第二层为算术、关系等中间计算,第三层为逻辑、赋值等组合操作;高频易错点包括&&与||的执行顺序、+与==的隐式转换、赋值右结合性,实践中应主动用括号明确意图。

记住 JavaScript 运算符优先级不需要死背整张表,关键在于掌握分层逻辑和几个高频易错点,再配合括号主动控制顺序——这样既能避免隐性 bug,又不会增加认知负担。
按“操作粒度”分三层理解
运算符本质是按“影响范围”分优先级的:越靠近单个值的,越先执行;越偏向组合判断或赋值的,越后执行。
-
第一层(最紧):括号
()、点号.、方括号[]、new、一元运算符(如!、++、-、typeof)。它们直接作用于一个操作数,天然高优先级。 -
第二层(中间计算):算术类(
**、*///%、+/-)、位移(、<code>>>)、关系与相等(、<code>==、===等)。这一层决定数值怎么算、比较怎么比。 -
第三层(逻辑组装与落定):逻辑运算符(
&&优先于||,再高于??)、条件运算符?:、赋值类(=、+=等,右结合)、逗号,。它们负责把前面的结果串起来、做分支、存下来。
必须警惕的三个典型陷阱
这些地方优先级反直觉,不加括号极易出错:
-
==和&&混用:比如a == b && c == d是安全的,但a == b || c == d && e > f中,&&会先于||执行。想表达“前两个任一为真且 e>f”,就得写成(a == b || c == d) && e > f。 -
+和==的隐式拼接风险:例如'1' + 2 == '12'返回true,因为+优先级高于==,先拼成字符串再比较;而'1' + 2 === '12'也是true,但'1' + 2 === 12是false。涉及字符串和数字混合时,显式括号或类型转换更可靠。 -
赋值嵌套中的右结合性:像
a = b = 5是合法的,因为=右结合,等价于a = (b = 5);但若混入&&,如a = b && c,就等于a = (b && c),不是(a = b) && c—— 后者需要手动加括号。
实用记忆与编码习惯
不靠硬记,靠结构化习惯来规避问题:
立即学习“Java免费学习笔记(深入)”;
- 遇到含
&&、||、??、?:的复杂条件,一律用括号包裹每个子表达式,比如:if ((x > 0) && (y !== null) && (z ?? 0) > 5)。 - 所有涉及
+的操作,如果左右类型不明确(尤其一边是字符串),主动加括号并注释意图,例如:'' + (count * price)或String(count) + ' items'。 - 写三元运算符时,把整个
?:当作一个单元处理,不要让它和&&或赋值紧邻,例如避免a && b ? c : d,改写为a && (b ? c : d)或拆成 if。 - 用 ESLint 规则
no-implicit-coercion和no-extra-parens(禁用冗余括号,但保留必要括号)辅助检查。
小结:优先级不是用来背的,是用来绕的
真正健壮的代码,不依赖人脑记住第7级和第8级谁高谁低,而是用括号让意图一目了然。一元运算符和括号你肯定不会忘,剩下大部分场景,加一对小括号的成本远低于调试一个因优先级引发的静默错误。


















