0

0

JavaScript逻辑或(||)运算符的正确用法与多值比较策略

DDD

DDD

发布时间:2025-09-19 13:10:18

|

457人浏览过

|

来源于php中文网

原创

JavaScript逻辑或(||)运算符的正确用法与多值比较策略

本文深入探讨JavaScript中逻辑或(||)运算符的正确用法,特别是在进行多值条件判断时常见的误区。我们将通过D&D角色职业选择的实际案例,揭示 if (variable === 'val1' || 'val2') 这种写法的错误原因,并提供 if (variable === 'val1' || variable === 'val2') 的正确实现。此外,还将介绍 Array.prototype.includes() 和 switch 语句等更优雅的多值比较策略,帮助开发者编写更健壮、可读性强的条件逻辑。

理解JavaScript中的逻辑或(||)运算符

javascript中,逻辑或运算符 || 用于连接两个或多个表达式。它的基本工作原理是:如果第一个操作数是“真值”(truthy),则返回第一个操作数的值;否则,它会评估第二个操作数并返回其值。这个过程被称为“短路评估”(short-circuit evaluation)。

在条件语句(如 if 语句)中,|| 运算符的返回值会被隐式转换为布尔值进行判断。这意味着只要 || 运算符的任何一个操作数被评估为真值,整个条件表达式就会被视为 true。

JavaScript中的真值和假值:

  • 假值(Falsy values):false, 0, -0, 0n (BigInt zero), "" (empty string), null, undefined, NaN。
  • 真值(Truthy values):除上述假值之外的所有值,包括非空字符串、非零数字、对象、数组等。

常见陷阱:多值比较中的误解

许多初学者在使用 || 运算符进行多值比较时,会遇到一个常见的误区。他们可能期望 if (variable === "value1" || "value2") 能够判断 variable 是否等于 "value1" 等于 "value2"。然而,这种写法并不会按照预期工作。

让我们通过一个具体的D&D角色职业选择案例来分析:

立即学习Java免费学习笔记(深入)”;

假设我们有一个HTML select 元素,用于选择角色职业:

<select name="class" id="character-class">
    <option value="artificer">Artificer</option>
    <option value="barbarian">Barbarian</option>
    <!-- ... 其他职业 ... -->
    <option value="sorcerer">Sorcerer</option>
    <option value="wizard">Wizard</option>
</select>

然后,在JavaScript中尝试根据选择的职业进行判断:

let characterClass = document.getElementById("character-class").value; // 假设默认值为 "artificer"
console.log(characterClass); // 输出 "artificer"

if (characterClass === "wizard" || "sorcerer") { // 错误写法
    console.log("Squishy boi");
} else {
    console.log("Not a wizard/sorcerer");
}

当 characterClass 的值为 "artificer" 时,这段代码的输出却是 "Squishy boi",而不是预期的 "Not a wizard/sorcerer"。这是因为 if (characterClass === "wizard" || "sorcerer") 这个条件表达式被错误地解析了:

  1. 首先评估 characterClass === "wizard"。由于 characterClass 是 "artificer",所以 characterClass === "wizard" 的结果是 false。
  2. 因为第一个操作数是 false,|| 运算符会继续评估第二个操作数,即 "sorcerer"。
  3. 字符串 "sorcerer" 是一个非空字符串,在JavaScript中被视为真值(truthy value)。
  4. 因此,整个条件表达式 false || true 的结果是 true。
  5. 最终,if 语句的条件被判断为 true,从而执行了 console.log("Squishy boi")。

正确的多值比较方法

要正确地使用 || 运算符进行多值比较,必须为每个比较条件重复变量本身:

云从科技AI开放平台
云从科技AI开放平台

云从AI开放平台

下载

1. 重复比较法

这是最直接和明确的修正方式。为 || 运算符的每个部分都提供一个完整的比较表达式:

let characterClass = document.getElementById("character-class").value; // 假设默认值为 "artificer"
console.log(characterClass);

if (characterClass === "wizard" || characterClass === "sorcerer") { // 正确写法
    console.log("Squishy boi");
} else {
    console.log("Not a wizard/sorcerer");
}

现在,如果 characterClass 是 "artificer":

  1. characterClass === "wizard" 结果为 false。
  2. characterClass === "sorcerer" 结果为 false。
  3. 整个条件表达式 false || false 的结果是 false。
  4. if 语句的条件被判断为 false,从而执行 else 块中的 console.log("Not a wizard/sorcerer")。这符合预期。

2. 更优雅的多值比较策略

当需要比较的值数量较多时,重复比较法可能会导致代码冗长且不易维护。以下是两种更优雅的替代方案:

a. 使用 Array.prototype.includes()

includes() 方法可以判断一个数组是否包含某个指定的值,返回 true 或 false。这使得它非常适合用于检查一个变量是否在多个预设值之中。

let characterClass = document.getElementById("character-class").value;
console.log(characterClass);

const squishyClasses = ["wizard", "sorcerer"]; // 将所有“脆弱”职业放入数组

if (squishyClasses.includes(characterClass)) { // 使用 includes() 方法
    console.log("Squishy boi");
} else {
    console.log("Not a wizard/sorcerer");
}

这种方法尤其适用于当需要比较的职业列表很长时,代码会更加简洁和可读。

b. 使用 switch 语句

当根据一个变量的不同值需要执行不同的操作时,switch 语句是一个非常清晰的选择。

let characterClass = document.getElementById("character-class").value;
console.log(characterClass);

switch (characterClass) {
    case "wizard":
    case "sorcerer":
        console.log("Squishy boi");
        // 这里可以执行与这些职业相关的其他逻辑
        break;
    // case "barbarian":
    // case "fighter":
    //     console.log("Tanky boi");
    //     break;
    default:
        console.log("Not a wizard/sorcerer");
        break;
}

在 switch 语句中,如果多个 case 块需要执行相同的代码,可以像上面那样将它们连续排列,而不使用 break,这样会“穿透”到下一个 case,直到遇到 break 或 switch 块结束。

注意事项与总结

  • 理解 || 的短路特性:|| 运算符会从左到右评估操作数,一旦遇到真值,就会立即返回该真值,而不再评估后续的操作数。这是导致 if (variable === "value1" || "value2") 行为异常的根本原因。
  • 区分表达式和值:在条件判断中,每个 || 运算符的操作数都应该是一个完整的布尔表达式(例如 variable === "value"),而不是一个单独的值(例如 "value2")。
  • 选择合适的比较策略
    • 对于两个或三个值的简单比较,重复比较法(a === b || a === c)足够清晰。
    • 当需要比较的值数量较多时,Array.prototype.includes() 提供了一种更简洁、更具可读性的解决方案。
    • 当需要根据变量的不同值执行不同的代码块时,switch 语句是更好的选择,它能使逻辑结构更清晰。

通过深入理解 || 运算符的工作原理并掌握正确的比较策略,开发者可以避免常见的逻辑错误,编写出更健壮、更易于维护的JavaScript代码。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

1031

2023.08.02

c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

254

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

1089

2024.03.01

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1567

2023.10.24

Go语言中的运算符有哪些
Go语言中的运算符有哪些

Go语言中的运算符有:1、加法运算符;2、减法运算符;3、乘法运算符;4、除法运算符;5、取余运算符;6、比较运算符;7、位运算符;8、按位与运算符;9、按位或运算符;10、按位异或运算符等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

241

2024.02.23

php三元运算符用法
php三元运算符用法

本专题整合了php三元运算符相关教程,阅读专题下面的文章了解更多详细内容。

150

2025.10.17

if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

847

2023.08.22

switch语句用法
switch语句用法

switch语句用法:1、Switch语句只能用于整数类型,枚举类型和String类型,不能用于浮点数类型和布尔类型;2、每个case语句后面必须跟着一个break语句,以防止执行其他case的代码块,没有break语句,将会继续执行下一个case的代码块;3、可以在一个case语句中匹配多个值,使用逗号分隔;4、Switch语句中的default代码块是可选的等等。

569

2023.09.21

TypeScript类型系统进阶与大型前端项目实践
TypeScript类型系统进阶与大型前端项目实践

本专题围绕 TypeScript 在大型前端项目中的应用展开,深入讲解类型系统设计与工程化开发方法。内容包括泛型与高级类型、类型推断机制、声明文件编写、模块化结构设计以及代码规范管理。通过真实项目案例分析,帮助开发者构建类型安全、结构清晰、易维护的前端工程体系,提高团队协作效率与代码质量。

1

2026.03.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
React 教程
React 教程

共58课时 | 6万人学习

TypeScript 教程
TypeScript 教程

共19课时 | 3.4万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 3.6万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号