JavaScript运算符优先级决定求值顺序,括号可强制改变顺序并提升可读性;核心层级包括圆括号、一元、乘性、加性、比较、逻辑、赋值运算符,三元、函数调用等场景需谨慎使用括号避免歧义。

JavaScript中运算符优先级决定了表达式里哪些操作先算、哪些后算。不靠括号时,引擎严格按优先级顺序执行;加了括号,就能强制改变求值顺序,避免意外结果。
优先级从高到低的关键层级
实际开发中不需要死记全部20级,掌握核心几层就够用:
-
圆括号 ():最高优先级,括号内一定最先算完,比如
(a + b) * c保证加法先于乘法 -
一元运算符:如
++、--、!、-(负号),比算术运算符更早执行,!a + b等价于(!a) + b -
乘性运算符:
*、/、%优先级高于加减,5 + 3 * 2结果是 11,不是 16 -
加性运算符:
+、-(二元),注意+还负责字符串拼接,1 + "2"得"12" -
比较运算符:
==、===、、<code>>等,总在算术之后执行,a + b > c先算加法再比较 -
逻辑运算符:
&&优先级高于||,a || b && c等价于a || (b && c),不是(a || b) && c -
赋值运算符:
=、+=等优先级最低,且右结合,a = b = 5是合法的,等价于a = (b = 5)
括号不只是“保险”,而是明确意图的工具
括号的作用不是单纯防错,而是让代码可读、可维护。尤其在混合类型或复杂逻辑时:
- 当表达式含多个逻辑运算符,比如
flag1 && flag2 || flag3 && flag4,直接读容易误判,写成(flag1 && flag2) || (flag3 && flag4)意图一目了然 - 涉及隐式类型转换时,
"" + a + b == c容易混淆,写成(("" + a) + b) == c或更清晰地拆成变量,能减少调试时间 - 三元运算符嵌套时必须用括号分隔,
a ? b : c ? d : e实际是a ? b : (c ? d : e),若想改成(a ? b : c) ? d : e,括号就不可省 - 函数调用与属性访问混用,如
obj.method() + 1没问题,但obj[method()] + 1中方括号优先级和点号一致,无需额外括号;而fn()(a + b)必须靠括号表明是“先调 fn 得函数,再用 a+b 调它”
常见陷阱与括号应对策略
有些组合看着自然,其实优先级反直觉:
立即学习“Java免费学习笔记(深入)”;
-
!a == b实际是(!a) == b,不是!(a == b)—— 后者必须写成!(a == b) -
a & b == c会先算b == c再按位与,因为==优先级高于&,真要按位比较得写成a & b == c→(a & b) == c -
typeof a == "string"本意是判断类型,但typeof优先级高于==,所以没问题;可如果写成typeof a + b,结果是字符串拼接("number" + b),想先加再判断就得typeof (a + b) - 箭头函数参数带解构时,
const fn = ({x}) => x * 2没括号不行,因为=>优先级很低,{x} =>会被解析为代码块,必须用({x}) =>


















