JavaScript 运算符:算术、比较、逻辑

简介

JavaScript 提供了丰富的运算符来处理数据。本文介绍最常用的三类运算符:算术运算符、比较运算符和逻辑运算符。


算术运算符

用于执行数学计算,也支持字符串拼接。

运算符 描述 示例
+ 加法 / 字符串拼接 3 + 58
- 减法 10 - 46
* 乘法 3 * 721
/ 除法 10 / 33.333...
% 取余(模运算) 10 % 31
** 幂运算(ES6) 2 ** 38
++ 自增 let a = 1; a++2
-- 自减 let b = 3; b--2

注意事项

+ 的字符串拼接行为:

console.log(1 + 2);       // 3(数字相加)
console.log('1' + 2);     // "12"(字符串拼接)
console.log(1 + '2');     // "12"(数字被转为字符串)
console.log(1 + 2 + '3'); // "33"(先算 1+2=3,再拼 "3")
console.log('3' + 1 + 2); // "312"(从左到右,先拼得 "31",再拼 "2")

自增/自减的前置与后置:

let x = 5;
let y = x++;  // y = 5, x = 6(后置:先返回值,再自增)
console.log(x, y); // 6 5

let a = 5;
let b = ++a;  // a = 6, b = 6(前置:先自增,再返回值)
console.log(a, b); // 6 6

取余运算:

console.log(10 % 3);  // 1
console.log(-10 % 3); // -1(结果的符号与被除数相同)

除零不会报错:

console.log(10 / 0);  // Infinity
console.log(-10 / 0); // -Infinity
console.log(0 / 0);   // NaN

比较运算符

用于比较两个值,返回 truefalse

运算符 描述 示例
== 相等(允许类型转换) 1 == '1'true
=== 严格相等(不允许类型转换) 1 === '1'false
!= 不相等(允许类型转换) 1 != '2'true
!== 严格不相等 1 !== '1'true
> 大于 5 > 3true
< 小于 5 < 3false
>= 大于等于 5 >= 5true
<= 小于等于 5 <= 3false

===== 的区别(重点)

==(宽松相等)会在比较前进行类型转换,===(严格相等)不会。

// == 允许类型转换
console.log(1 == '1');     // true(字符串 '1' 被转为数字 1)
console.log(1 == true);    // true(true 被转为数字 1)
console.log(0 == false);   // true(false 被转为数字 0)
console.log('' == false);  // true(两者都被转为 0)
console.log(null == undefined); // true(特殊规则)

// === 不转换类型,类型和值都必须相同
console.log(1 === '1');    // false(类型不同)
console.log(1 === true);   // false(类型不同)
console.log(0 === false);  // false(类型不同)
console.log(null === undefined); // false(类型不同)

建议:始终使用 ===!==,避免因隐式类型转换导致的难以发现的 bug。

特殊值的比较

console.log(NaN == NaN);   // false(NaN 不等于任何值,包括自身)
console.log(NaN === NaN);  // false
console.log(isNaN(NaN));   // true(判断是否为 NaN 的正确方式)

console.log(null == null);       // true
console.log(undefined == undefined); // true
console.log(null == undefined);  // true(== 下相等)
console.log(null === undefined); // false(=== 下不相等)

逻辑运算符

用于组合或修改布尔值,支持短路求值。

运算符 描述 示例
&& 逻辑与(AND) true && falsefalse
` `
! 逻辑非(NOT) !truefalse

短路求值(重要)

JavaScript 的 &&|| 返回的是操作数本身,而不是布尔值。

&&(逻辑与):

// 如果第一个操作数为假,直接返回第一个值;否则返回第二个值
console.log(true && 'hello');   // "hello"
console.log(false && 'hello');  // false
console.log(0 && 'hello');      // 0
console.log('' && 'hello');     // ""

// 短路:第一个为假时,不会执行第二个表达式
let x = 0;
x > 0 && console.log('这行不会执行');

||(逻辑或):

// 如果第一个操作数为真,直接返回第一个值;否则返回第二个值
console.log(true || 'hello');   // true
console.log(false || 'hello');  // "hello"
console.log('' || 'default');   // "default"
console.log('hi' || 'default'); // "hi"

// 常见用法:设置默认值
function greet(name) {
  name = name || 'Guest';
  console.log('Hello, ' + name);
}
greet();        // Hello, Guest
greet('Alice'); // Hello, Alice

!(逻辑非):

console.log(!true);   // false
console.log(!false);  // true
console.log(!0);      // true
console.log(!'abc');  // false

// 双重取反:转为布尔值
console.log(!!'hello'); // true(等价于 Boolean('hello'))
console.log(!!0);       // false
console.log(!!'');      // false

真值与假值

在逻辑运算中,以下值被视为 假值(falsy),其余都是 真值(truthy)

  • false
  • 0-0
  • ''""(空字符串)
  • null
  • undefined
  • NaN
// 所有假值
console.log(Boolean(false));   // false
console.log(Boolean(0));       // false
console.log(Boolean(''));      // false
console.log(Boolean(null));    // false
console.log(Boolean(undefined)); // false
console.log(Boolean(NaN));    // false

// 真值示例
console.log(Boolean('0'));    // true(非空字符串)
console.log(Boolean([]));     // true(空数组是真值!)
console.log(Boolean({}));     // true(空对象是真值!)

运算符优先级(简表)

当表达式中包含多个运算符时,优先级决定执行顺序。

优先级 运算符 说明
++ -- 自增、自减
** 幂运算
* / % 乘、除、取余
+ - 加、减
> < >= <= 比较运算符
== === != !== 相等运算符
&& 逻辑与
|| 逻辑或
// 优先级示例
console.log(3 + 4 * 5);     // 23(先乘后加)
console.log((3 + 4) * 5);   // 35(括号改变优先级)

console.log(true || false && false); // true(&& 优先级高于 ||)
// 等价于:true || (false && false)

建议:当表达式复杂时,使用括号 () 明确优先级,提高可读性。


综合示例

// 判断一个数是否在指定范围内
function inRange(num, min, max) {
  return num >= min && num <= max;
}
console.log(inRange(5, 1, 10)); // true
console.log(inRange(15, 1, 10)); // false

// 提供默认值
function divide(a, b) {
  if (b === 0 || typeof b !== 'number') {
    return NaN;
  }
  return a / b;
}

// 短路求值实现条件执行
let user = null;
user && console.log('用户:', user.name); // 不会执行

user = { name: 'Alice' };
user && console.log('用户:', user.name); // 用户: Alice