括号是明确运算意图、避免逻辑陷阱的关键;!a==b、a&b==c、typeof a+b等易错表达式需加括号显式分组,三元嵌套、逻辑组合及解构参数也必须用括号确保正确性。

JavaScript 中运算符优先级本身不会“避免”错误,但它决定了表达式默认怎么算;真正能帮你避开逻辑陷阱的,是主动用括号把意图写清楚。
看清哪些运算符容易“偷偷先算”
有些组合看着顺眼,其实执行顺序和直觉相反:
- !a == b 实际是 (!a) == b,不是 !(a == b) —— 想取反整个比较就得加括号
- a & b == c 先算 b == c,再跟 a 做按位与,因为 == 优先级高于 &;真要比较 a & b 的结果,得写成 (a & b) == c
- typeof a + b 会先得到字符串(比如 "number"),再拼接 b;想先算 a + b 再判断类型,必须写成 typeof (a + b)
逻辑表达式别靠记忆硬读
&& 总比 || 先算,但人脑不擅长临时解析嵌套:
- flag1 && flag2 || flag3 && flag4 等价于 (flag1 && flag2) || (flag3 && flag4),但光看没括号的原式容易误判成左到右顺序
- 三元运算符嵌套时更危险:a ? b : c ? d : e 实际是 a ? b : (c ? d : e);如果业务逻辑本意是 (a ? b : c) ? d : e,括号就非加不可
混合类型运算时括号是“显式转换”的提示器
加法 + 既是数学加法又是字符串拼接,优先级虽不高,但行为易混淆:
- "" + a + b == c 会被解析为 (("" + a) + b) == c,但不如拆成变量或加括号来得清晰
- 1 + 2 == 3 没问题,但 1 + "2" == "3" 是 false(因为 1 + "2" 得 "12",再跟 "3" 比较)—— 这类隐式转换靠括号没法防,但加括号能让你停下来检查类型是否一致
函数调用和属性访问别想当然
点号 . 和方括号 [] 优先级高,但箭头函数、链式调用容易出错:
- fn()(a + b) 表示“先调 fn 得到一个函数,再用 a + b 调它”,括号不能省;写成 fn() (a + b)(中间空格)会报错
- 解构参数必须用括号:({x}) => x * 2 合法,{x} => x * 2 会被当成代码块,语法错误
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











