Javascript 零基础教程

JavaScript 逻辑运算符

逻辑运算符允许你组合或修改布尔表达式。

它们对于在代码中创建复杂条件至关重要,使你能够基于多个因素控制执行流程。有效使用逻辑运算符是编写健壮且灵活的 JavaScript 程序的关键。

本章节将全面概述 && (与)、|| (或) 和 ! (非) 运算符,包括它们的真值表、实际示例和常见用例。

1. 理解 && (与) 运算符

&& 运算符,也称为逻辑与 (Logical AND) 运算符。

规则: 当且仅当两个操作数true(真)时,它才返回 true。如果任一操作数为 false(假),整个表达式的计算结果即为 false

1.1 && 的真值表

操作数 A操作数 BA && B
truetruetrue
truefalsefalse
falsetruefalse
falsefalsefalse

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 > 10false,所以 y++ 表达式从未执行。这对于防止错误(例如检查对象是否存在再访问其属性)或通过避免不必要的计算来提高性能非常有用。

2. 理解 || (或) 运算符

|| 运算符,也称为逻辑或 (Logical OR) 运算符。

规则: 只要至少有一个操作数为 true,它就返回 true。只有当两个操作数false 时,它才返回 false

2.1 || 的真值表

操作数 A操作数 BA || B
truetruetrue
truefalsetrue
falsetruetrue
falsefalsefalse

2.2 || 的示例

let isWeekend = true;  // 是周末
let isHoliday = false; // 是节假日

// 如果是周末 或者 是节假日,我们就可以休息
if (isWeekend || isHoliday) {
  console.log("是时候休息了!");
} else {
  console.log("回去工作。");
}
// 输出: 是时候休息了!

在这个例子中,|| 运算符检查是否是 isWeekend或者isHoliday。由于 isWeekendtrue,整个表达式的计算结果为 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 < 10true,所以 b++ 表达式从未执行。

3. 理解 ! (非) 运算符

! 运算符,也称为逻辑非 (Logical NOT) 运算符。

规则: 它是一个一元运算符(只对一个操作数进行操作),用于反转其操作数的值。如果操作数为 true! 运算符返回 false,反之亦然。

3.1 ! 的真值表

操作数!操作数
truefalse
falsetrue

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("访问已授予。");
}
// 输出: 访问被拒绝。

在这里,! 运算符检查用户是否没有权限。由于 hasPermissionfalse!hasPermission 的计算结果为 true

3.3 对真值 (Truthy) 和假值 (Falsy) 使用 !

! 运算符也可以用于真值和假值。还记得在“JavaScript 数据类型”课程中提到的吗?某些值即使不是显式的 truefalse,也会被视为真值或假值。

let myString = ""; // 空字符串是一个假值 (falsy)

if (!myString) {
  console.log("字符串是空的。");
} else {
  console.log("字符串不是空的。");
}
// 输出: 字符串是空的。

在这个例子中,空字符串 "" 是一个假值。因此,!myString 将其反转为 true,执行 if 块内的代码。

4. 组合逻辑运算符

你可以组合多个逻辑运算符来创建更复杂的条件。组合运算符时,了解优先级很重要。

  1. ! (最高优先级)
  2. &&
  3. || (最低优先级)

你可以使用括号 () 来覆盖默认的优先级,并使你的代码更具可读性。

4.1 组合逻辑运算符的示例

let age = 30;
let hasLicense = true;
let isInsured = false; // 有保险

// 要租车,你必须年满 25 岁,有驾照,并且有保险
if (age >= 25 && hasLicense && isInsured) {
  console.log("你可以租车。");
} else {
  console.log("你不能租车。");
}
// 输出: 你不能租车。

在这个例子中,所有三个条件都必须为真,人才能租车。由于 isInsuredfalse,整个表达式的计算结果为 false

let isStudent = true;       // 是学生
let isSeniorCitizen = false; // 是老年人
let hasDiscountCode = true;  // 有折扣码

// 如果你是学生,或者你是老年人,或者你有折扣码,你就可以获得折扣
if (isStudent || isSeniorCitizen || hasDiscountCode) {
  console.log("你获得了折扣!");
} else {
  console.log("没有折扣。");
}
// 输出: 你获得了折扣!

在这里,只要有一个条件为真,就能获得折扣。由于 isStudenttrue,整个表达式的计算结果为 true

let isLoggedIn = true;
let isAdmin = false;
let isEditor = true;

// 你必须登录,并且是管理员或者编辑,才能访问某些功能
if (isLoggedIn && (isAdmin || isEditor)) {
  console.log("已授予高级功能访问权限。");
} else {
  console.log("拒绝访问高级功能。");
}
// 输出: 已授予高级功能访问权限。

在这个例子中,括号确保了 || 运算符在 && 运算符之前被评估。用户必须登录,并且(是管理员或者是编辑)才能访问高级功能。