掌握JavaScript运算符高级用法需聚焦四点:1.加号拼接与数值转换逻辑,减号强制转数字;2.??和?.替代冗余空值判断;3.前置/后置自增在表达式中顺序差异;4.逻辑运算符返回原值及奇偶判断的位运算优化。

掌握 JavaScript 运算符的高级用法,关键不是死记符号,而是理解它们在真实场景中如何“协作”、何时“隐式转换”、以及哪些新特性能替代老写法。下面几个方向最值得聚焦:
搞懂加号(+)和减号(-)的类型转换逻辑
加号有双重身份:数值相加 or 字符串拼接。只要任一操作数是字符串,整个表达式就走拼接路线:
-
123 + "45"→"12345" -
true + 2→3(true转为1) -
"12" + null→"12null"(null转为字符串"null")
减号则完全不同:它强制把所有操作数转成数字再计算:
-
"10" - "3"→7 -
"abc" - 1→NaN -
{} - []→0(对象和空数组分别转为"[object Object]"和"",再转数字失败后取0)
用好空值合并(??)和可选链(?.)替代冗长判断
ES2020 引入的这两个运算符,专治“层层取属性怕报错”的痛点:
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
立即学习“Java免费学习笔记(深入)”;
-
user?.profile?.name ?? "匿名":如果中间任何一层是null或undefined,直接短路返回默认值,不报错 -
obj?.[key]和arr?.[0]同样安全,比obj && obj.profile && obj.profile.name清爽得多 -
??只在左侧为null或undefined时生效;它和||不同——0 ?? "缺省"是0,而0 || "缺省"是"缺省"
理解自增/自减与赋值顺序的细节
看似简单,但前置(++a)和后置(a++)在表达式中行为差异明显:
-
let a = 5; console.log(a++ + ++a);→ 先用5,再加到6,然后前置加到7再用,结果是5 + 7 = 12 - 在循环里多用
i++是习惯,但若需立即使用新值,必须用++i - 复合赋值如
a += b等价于a = a + b,但更安全——不会重复求值a(比如arr[i++] += 1中i只递增一次)
善用逻辑运算符做条件简化,但警惕隐式转换陷阱
&& 和 || 返回的是操作数本身,不是布尔值:
-
0 || "fallback"→"fallback"(常用作默认值) -
"hello" && true && 42→42(最后一个真值) - 注意:
0、""、null、undefined、NaN、false都是假值,但只有==会宽松匹配,===才严格区分类型 - 判断奇偶别只写
x % 2 === 0,负数时会出错;稳妥写法是Math.abs(x) % 2 === 0或用位运算(x & 1) === 0

















