JavaScript 运算符:算术、比较、逻辑
简介
JavaScript 提供了丰富的运算符来处理数据。本文介绍最常用的三类运算符:算术运算符、比较运算符和逻辑运算符。
算术运算符
用于执行数学计算,也支持字符串拼接。
| 运算符 | 描述 | 示例 |
|---|---|---|
+ |
加法 / 字符串拼接 | 3 + 5 → 8 |
- |
减法 | 10 - 4 → 6 |
* |
乘法 | 3 * 7 → 21 |
/ |
除法 | 10 / 3 → 3.333... |
% |
取余(模运算) | 10 % 3 → 1 |
** |
幂运算(ES6) | 2 ** 3 → 8 |
++ |
自增 | 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
比较运算符
用于比较两个值,返回 true 或 false。
| 运算符 | 描述 | 示例 |
|---|---|---|
== |
相等(允许类型转换) | 1 == '1' → true |
=== |
严格相等(不允许类型转换) | 1 === '1' → false |
!= |
不相等(允许类型转换) | 1 != '2' → true |
!== |
严格不相等 | 1 !== '1' → true |
> |
大于 | 5 > 3 → true |
< |
小于 | 5 < 3 → false |
>= |
大于等于 | 5 >= 5 → true |
<= |
小于等于 | 5 <= 3 → false |
== 与 === 的区别(重点)
==(宽松相等)会在比较前进行类型转换,===(严格相等)不会。
// == 允许类型转换
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 && false → false |
| ` | ` | |
! |
逻辑非(NOT) | !true → false |
短路求值(重要)
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):
false0、-0''、""(空字符串)nullundefinedNaN
// 所有假值
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