JS运算符优先级无需死记全表,关键掌握五层逻辑:分组/访问最高,单目次之,数学运算按“幂>乘除>加减”,比较在算术后、逻辑中&&高于||,赋值与逗号最低;盯住+/-双重身份、==与||混用、??与||组合三类易错点;多用括号明确意图,提升可读性与安全性。

记住 JS 运算符优先级不需要死背整张表,关键是抓住几条核心规律,再配合少量高频组合和括号习惯,就能在写代码时快速判断、少出错。
按“功能层级”分组记忆
把 20 级优先级压缩成 5 层逻辑块,每层内部运算符优先级相近,且符合直觉:
-
最外层:控制流与结构 ——
()(分组)、.(属性访问)、[](下标)、new(带参构造)排最高,因为它们定义了“谁在操作谁”; -
单目操作先行 ——
++、--、!、+、-、typeof等紧贴操作数,天然高优先级,比如!arr[0]先取元素再取反; -
数学计算分两档 ——
**(幂)>* / %(乘除模)>+ -(加减),和小学数学“先乘方、再乘除、最后加减”完全一致; -
比较与逻辑分先后 —— 所有比较(
等)都在算术之后,而 <code>&&比||优先级高(a && b || c等价于(a && b) || c); -
赋值与逗号收尾 —— 赋值类(
= += ??=)和三元? :优先级很低,,最低,所以a = b + c * d不会误判为(a = b) + c * d。
盯住三组易错组合
这些组合在真实代码中高频出现,理解它们比记全表更实用:
-
+ -的双重身份:既是二元加减,也是一元正负号。例如let x = -a + b中,-a先算,再加b; -
==和&&混用:如val == null || val == undefined可简化为val == null(因==对null/undefined特殊处理),但val == '0' || val == 0就不能乱简——这里==优先级低于||,不会提前合并; -
??和&&/||并存:user?.name ?? 'guest' || 'anon'实际是(user?.name ?? 'guest') || 'anon',因为??优先级(5)高于||(6),这点常被忽略。
用括号代替记忆
只要表达式含两个以上不同类运算符,就主动加括号——这不是妥协,而是明确意图、提升可维护性的专业习惯:
- 算术混合字符串时:
price * qty + '$'明确写成(price * qty) + '$',避免有人误读为price * (qty + '$'); - 逻辑组合复杂条件时:
isAdmin && (role === 'editor' || role === 'admin')比isAdmin && role === 'editor' || role === 'admin'清晰十倍; - 链式赋值或空值处理:
(obj?.data ?? defaultValue).length比不加括号更安全,防止??和.关联性引发歧义。
调试时快速验证技巧
遇到不确定的表达式,别猜,3 秒验证:
- 打开浏览器控制台,直接输入表达式看结果,比如
true || false && false→true,说明&&先于||; - 用
console.log分段打印中间值,例如const res = a + b * c > d && e ?? f;可拆成const part1 = b * c; const part2 = a + part1; …; - ESLint 插件(如
no-unsafe-negation或no-extra-parens)能自动提示潜在优先级风险,开起来就行。











