JavaScript逻辑运算符优先级为!最高、&&次之、||最低,混合运算时严格按此顺序分步执行,如!a&&b||c等价于((!a)&&b)||c,而非!(a&&b)||c或!a&&(b||c)。

JavaScript 中逻辑运算符的优先级是明确且固定的:!非 最高,&& 与 次之,|| 或 最低。混合运算时,引擎严格按此顺序分步执行,不依赖括号也能得出唯一结果。
优先级顺序决定执行步骤
表达式中多个逻辑运算符共存时,不会从左到右“平铺”计算,而是先找优先级最高的部分处理:
- ! 总是第一个被求值:它只作用于紧邻右侧的单个操作数(无论该操作数是变量、表达式还是括号组)
- && 在 ! 之后执行:它的左右两侧必须各自完成求值后,才进行“与”判断
- || 最后执行:它把 && 的结果当作一个整体,再和另一侧组合
例如:!a && b || c 实际等价于 ((!a) && b) || c,不是 !(a && b) || c,更不是 !a && (b || c)。
为什么不能靠直觉加括号?
很多初学者误以为 a || b && c 会按书写顺序先算 a || b,但实际是 a || (b && c)。这种误解常导致权限判断、表单校验等逻辑出错:
立即学习“Java免费学习笔记(深入)”;
- 错误写法:
if (role === 'user' || role === 'admin' && status === 'active')
本意可能是“用户或管理员”,但实际只对管理员加了状态限制 - 正确写法:
if ((role === 'user' || role === 'admin') && status === 'active')
加括号显式表明意图,避免歧义
短路行为叠加优先级的影响
优先级决定了哪部分先“入场”,而 && 和 || 的短路特性则影响哪些代码真正运行:
-
!x && y++:先算!x;若为 false,则y++不执行 -
a() || b() && c():先调用a();若返回真值,b()和c()都不执行 -
!isValid() || saveData() && notify():先执行isValid()取反;若为 true(即原函数返回 false),整个表达式直接为 true,后面两个函数都不调用
实用建议:什么时候该加括号?
即使知道优先级,也推荐在以下情况主动加括号:
- 条件逻辑有业务语义分组(如“登录态或游客,且未封禁”)→ 写成
(isLoggedIn || isGuest) && !isBanned - 表达式含函数调用、赋值或副作用操作 → 明确执行边界,提升可读性与可维护性
- 团队协作或代码审查场景 → 减少他人理解成本,避免“我以为你知道”的沟通陷阱


















