JavaScript 逻辑运算符
逻辑运算符允许你组合或修改布尔表达式。
它们对于在代码中创建复杂条件至关重要,使你能够基于多个因素控制执行流程。有效使用逻辑运算符是编写健壮且灵活的 JavaScript 程序的关键。
本章节将全面概述 && (与)、|| (或) 和 ! (非) 运算符,包括它们的真值表、实际示例和常见用例。
1. 理解 && (与) 运算符
&& 运算符,也称为逻辑与 (Logical AND) 运算符。
规则: 当且仅当两个操作数都为 true(真)时,它才返回 true。如果任一操作数为 false(假),整个表达式的计算结果即为 false。
1.1 && 的真值表
| 操作数 A | 操作数 B | A && B |
|---|---|---|
true | true | true |
true | false | false |
false | true | false |
false | false | false |
1.2 && 示例
let age = 25;
let hasLicense = true; // 是否有驾照
// 只有当两个条件都满足时,这人才能开车
if (age >= 16 && hasLicense) {
console.log("你有资格开车。");
} else {
console.log("你没有资格开车。");
}
// 输出: 你有资格开车。在这个例子中,&& 运算符检查 age 是否大于或等于 16 并且hasLicense 变量是否为 true。由于两个条件都满足,因此执行 if 块内的代码。
let isLoggedIn = false; // 是否登录
let isAdmin = false; // 是否管理员
if (isLoggedIn && isAdmin) {
console.log("欢迎,管理员!");
} else {
console.log("欢迎!");
}
// 输出: 欢迎!在这里,即使用户可能已经登录,但他们不是管理员。因此,isLoggedIn && isAdmin 表达式的计算结果为 false,显示 "欢迎!" 消息。
1.3 使用 && 进行短路求值 (Short-Circuit Evaluation)
JavaScript 对 && 运算符使用短路求值。
这意味着如果第一个操作数为 false,则不会评估第二个操作数,因为无论第二个操作数是什么,表达式的结果都将是 false。
let x = 5;
let y = 10;
// x > 10 是 false,所以 y++ 永远不会执行
if (x > 10 && y++) {
console.log("这行不会被打印。");
}
console.log(y); // 输出: 10 (y 没有自增)在这个例子中,x > 10 为 false,所以 y++ 表达式从未执行。这对于防止错误(例如检查对象是否存在再访问其属性)或通过避免不必要的计算来提高性能非常有用。
2. 理解 || (或) 运算符
|| 运算符,也称为逻辑或 (Logical OR) 运算符。
规则: 只要至少有一个操作数为 true,它就返回 true。只有当两个操作数都为 false 时,它才返回 false。
2.1 || 的真值表
| 操作数 A | 操作数 B | A || B |
|---|---|---|
true | true | true |
true | false | true |
false | true | true |
false | false | false |
2.2 || 的示例
let isWeekend = true; // 是周末
let isHoliday = false; // 是节假日
// 如果是周末 或者 是节假日,我们就可以休息
if (isWeekend || isHoliday) {
console.log("是时候休息了!");
} else {
console.log("回去工作。");
}
// 输出: 是时候休息了!在这个例子中,|| 运算符检查是否是 isWeekend或者isHoliday。由于 isWeekend 为 true,整个表达式的计算结果为 true,执行 if 块内的代码。
let temperature = 15; // 摄氏度
let isRaining = true; // 正在下雨
if (temperature < 0 || isRaining) {
console.log("穿上外套!");
} else {
console.log("享受天气!");
}
// 输出: 穿上外套!在这里,虽然温度不低于 0 度,但确实正在下雨。因此,temperature < 0 || isRaining 表达式的计算结果为 true,显示 "穿上外套!" 消息。
2.3 使用 || 进行短路求值
|| 运算符也使用短路求值。如果第一个操作数为 true,则不会评估第二个操作数,因为无论第二个操作数是什么,表达式的结果都将是 true。
let a = 5;
let b = 10;
// a < 10 是 true,所以 b++ 永远不会执行
if (a < 10 || b++) {
console.log("这行会被打印。");
}
console.log(b); // 输出: 10 (b 没有自增)在这个例子中,a < 10 为 true,所以 b++ 表达式从未执行。
3. 理解 ! (非) 运算符
! 运算符,也称为逻辑非 (Logical NOT) 运算符。
规则: 它是一个一元运算符(只对一个操作数进行操作),用于反转其操作数的值。如果操作数为 true,! 运算符返回 false,反之亦然。
3.1 ! 的真值表
| 操作数 | !操作数 |
|---|---|
true | false |
false | true |
3.2 ! 的示例
let isSunny = false; // 是晴天
// 如果不是晴天,我们可能需要带伞
if (!isSunny) {
console.log("带把伞!");
} else {
console.log("享受阳光!");
}
// 输出: 带把伞!在这个例子中,! 运算符反转了 isSunny 的值(即 false)。因此,!isSunny 的计算结果为 true,执行 if 块内的代码。
let hasPermission = false; // 有权限
if (!hasPermission) {
console.log("访问被拒绝。");
} else {
console.log("访问已授予。");
}
// 输出: 访问被拒绝。在这里,! 运算符检查用户是否没有权限。由于 hasPermission 为 false,!hasPermission 的计算结果为 true。
3.3 对真值 (Truthy) 和假值 (Falsy) 使用 !
! 运算符也可以用于真值和假值。还记得在“JavaScript 数据类型”课程中提到的吗?某些值即使不是显式的 true 或 false,也会被视为真值或假值。
let myString = ""; // 空字符串是一个假值 (falsy)
if (!myString) {
console.log("字符串是空的。");
} else {
console.log("字符串不是空的。");
}
// 输出: 字符串是空的。在这个例子中,空字符串 "" 是一个假值。因此,!myString 将其反转为 true,执行 if 块内的代码。
4. 组合逻辑运算符
你可以组合多个逻辑运算符来创建更复杂的条件。组合运算符时,了解优先级很重要。
!(最高优先级)&&||(最低优先级)
你可以使用括号 () 来覆盖默认的优先级,并使你的代码更具可读性。
4.1 组合逻辑运算符的示例
let age = 30;
let hasLicense = true;
let isInsured = false; // 有保险
// 要租车,你必须年满 25 岁,有驾照,并且有保险
if (age >= 25 && hasLicense && isInsured) {
console.log("你可以租车。");
} else {
console.log("你不能租车。");
}
// 输出: 你不能租车。在这个例子中,所有三个条件都必须为真,人才能租车。由于 isInsured 为 false,整个表达式的计算结果为 false。
let isStudent = true; // 是学生
let isSeniorCitizen = false; // 是老年人
let hasDiscountCode = true; // 有折扣码
// 如果你是学生,或者你是老年人,或者你有折扣码,你就可以获得折扣
if (isStudent || isSeniorCitizen || hasDiscountCode) {
console.log("你获得了折扣!");
} else {
console.log("没有折扣。");
}
// 输出: 你获得了折扣!在这里,只要有一个条件为真,就能获得折扣。由于 isStudent 为 true,整个表达式的计算结果为 true。
let isLoggedIn = true;
let isAdmin = false;
let isEditor = true;
// 你必须登录,并且是管理员或者编辑,才能访问某些功能
if (isLoggedIn && (isAdmin || isEditor)) {
console.log("已授予高级功能访问权限。");
} else {
console.log("拒绝访问高级功能。");
}
// 输出: 已授予高级功能访问权限。在这个例子中,括号确保了 || 运算符在 && 运算符之前被评估。用户必须登录,并且(是管理员或者是编辑)才能访问高级功能。