讲解

运算符是对值进行计算的符号。算术运算符包括 + - * /、取余 %(求除法余数)、乘方 **,以及自增自减 ++、--。比较运算符返回布尔值:>、>=、<、<= 比较大小,而相等比较有两套——==(宽松相等,比较前会做隐式类型转换)和 ===(严格相等,类型不同直接 false)。现代代码只用 === 和 !==,把 == 留给历史。

逻辑运算符有三个:&&(与)、||(或)、!(非)。要特别注意 && 和 || 的行为:它们不是简单返回 true/false,而是返回「决定结果的那个操作数」——a && b 中 a 为假就返回 a,否则返回 b;a || b 中 a 为真就返回 a,否则返回 b。这个特性衍生出两个常用写法:obj && obj.name 做防御性访问,value || 默认值 提供兜底。

还有两个现代运算符非常实用:可选链 ?. 在左边为 null/undefined 时短路返回 undefined 而不是报错;空值合并 ?? 只在左边为 null 或 undefined 时取右边的值(而 || 会把 0、'' 这些假值也吞掉)。三元运算符 条件 ? 值1 : 值2 则是单行版的 if...else。

示例

console.log('算术:', 7 % 3, 2 ** 10, 10 / 4);

// == 与 === 的区别
console.log('宽松相等:', 1 == '1', null == undefined);
console.log('严格相等:', 1 === '1', null === undefined);

// && 和 || 返回操作数本身
console.log('或运算:', 0 || '默认值', '有值' || '默认值');
console.log('与运算:', '通过' && '继续', '' && '继续');

// ?? 只在 null/undefined 时兜底
const count = 0;
console.log('|| 的结果:', count || 100); // 100 —— 0 被当成假值吞掉了
console.log('?? 的结果:', count ?? 100); // 0 —— 正确保留

// 可选链与三元
const user = null;
console.log('可选链:', user?.name); // undefined,不报错
console.log('三元:', 18 >= 18 ? '成年' : '未成年');

常见坑

  • 混用 == 与 ===:0 == '' 是 true、' ' == 0 也是 true,宽松相等的转换规则没人记得全,一律用 ===。
  • 用 || 给可能为 0 的值兜底:pageSize || 20 会把合法的 0 变成 20。数值、空字符串场景的默认值请用 ??。
  • 误解 % 对负数的语义:-7 % 3 在 JavaScript 里得 -1(余数与被除数同号),不是数学上的模运算 2。
  • 链式比较:Python 里 1 < x < 10 的写法在 JavaScript 中是错的——它先算 1 < x 得布尔值再和 10 比。要写 1 < x && x < 10。

小结

算术、比较、逻辑三组运算符覆盖日常计算;相等比较只用 ===;?. 和 ?? 是处理空值的现代利器。下一节深入一个麻烦制造者:隐式类型转换。