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

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 元素,用于选择角色职业:

    Artificer    Barbarian        Sorcerer    Wizard

然后,在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”) 这个条件表达式被错误地解析了:

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

正确的多值比较方法

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

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”:

characterClass === “wizard” 结果为 false。characterClass === “sorcerer” 结果为 false。整个条件表达式 false || false 的结果是 false。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代码。

以上就是JavaScript逻辑或(||)运算符的正确用法与多值比较策略的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1576841.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
HTML字体图标怎么用_图标字体SEO优化方案
上一篇 2025年12月22日 18:23:22
JavaScript中||(逻辑或)运算符在条件判断中的正确使用与常见陷阱
下一篇 2025年12月22日 18:23:28

相关推荐

  • 使用Yii作为微服务架构的后端

    使用yii框架可以有效地构建微服务架构的后端。1) yii的restful api支持强大,适合定义和管理api端点。2) 依赖注入容器便于管理服务间依赖。3) 模块化设计有助于功能拆分和重组。4) 性能优化和最佳实践,如缓存和日志系统,提升服务性能和可靠性。 你想知道如何使用Yii框架来构建微服务…

    2026年8月27日
    000
  • VSCode怎么调出HTML模板_VSCode快速生成HTML基础模板结构教程

    答案:在VSCode中输入!后按Tab键即可快速生成HTML5模板,也可使用html:5或doc等Emmet缩写,若失效需检查文件类型和设置,还可通过自定义snippets.json实现个性化模板。 在VSCode中快速生成HTML基础模板结构,最直接也最常用的方法就是利用其内置的Emmet功能。你…

    2026年8月26日
    000
  • 使用JAXB解析带命名空间的XML请求到Java对象

    本文旨在帮助开发者解决在使用JAXB(Java Architecture for XML Binding)将包含命名空间的XML请求解析为Java对象时遇到的`UnmarshalException`异常。通过修改`@XmlRootElement`注解,明确指定命名空间,可以有效解决由于命名空间不匹配…

    2026年8月26日
    000
  • 告别繁琐的DOM操作:如何使用s9e/sweetdom优雅地处理XML和XSLT模板

    可以通过一下地址学习composer:学习地址 最近在开发一个需要频繁操作xml文档,尤其是xslt模板的项目时,我遇到了一个让人头疼的问题。php原生的dom扩展虽然功能强大,但其api设计往往显得过于底层和繁琐。例如,创建一个新元素、将其插入到指定位置,或者执行一个xpath查询,都需要好几行代…

    2026年8月26日
    000
  • 2K正式发表《NBA 2K26》 9月5日发售

    2k正式发表《nba 2k26》,预定9月5日登陆ps5、ps4、xboxs、xbox one、switch2、switch、pc平台。 Shai Gilgeous-Alexander、Angel Reese、Carmelo Anthony分别担任标准版、WNBA版、超级巨星版封面人物。 以上就是2…

    2026年8月26日
    000
  • Java中组合优于继承的设计理念

    组合优于继承是Java设计原则,主张通过对象组合实现代码复用,而非继承。它降低耦合、提升灵活性与可维护性。继承导致紧耦合、破坏封装、单继承限制等问题,而组合通过接口依赖、运行时行为切换、多行为集成等优势弥补这些缺陷。实践中应定义行为接口,在类中持有接口引用并注入具体实现。该原则提倡慎用继承,仅在明确…

    2026年8月26日
    000
  • 曝小米 15 和一加 13 都在测试超声波指纹 摄像模组有变化

    小米和一加的数字系列旗舰都是手机市场上人气非常高的机型,目前,这两大产品线分别来到了小米 14 系列和一加 12。而据 cnmo 了解,接下来的小米 15 系列和一加 13 系列都已经有消息流出。据悉,这两款新旗舰都在测试超声波指纹功能。此外,新机背面的摄像头模组排列也会有变化,这意味着它们在外观设…

    2026年8月26日
    000
  • Windows中Loader Lock引起的死锁问题

    在程序开发中,常见的做法是将程序模块化,通常实现为动态链接库(dll)。在主程序启动时,可以通过隐式或显式的方式加载这些动态链接库。然而,在windows系统中,如果动态链接库的dllmain函数编写不当,可能会导致一些意想不到的bug,例如典型的loader lock死锁问题。这是一个许多wind…

    2026年8月26日
    000
  • 豆瓣APP怎么看回复过的帖子_个人回复历史与互动记录查找步骤

    可通过“我的小组”和“我的发布”查看回复记录。首先在豆瓣APP点击“小组”进入“我的小组”,选择“我回复的”查看小组互动;再进入“我的”页面,点击“我的发布”中的“评论”分类,浏览其他内容下的评论记录。 如果您在豆瓣APP中想要查找自己曾经回复过的帖子,但无法快速定位互动记录,可以通过系统内置的功能…

    2026年8月26日
    100
  • Eloquent中的查询构建器(Query Builder)用法

    在laravel中,如何使用eloquent的查询构建器?1. 使用db::table()方法查询数据,如$users = db::table(‘users’)->get()获取所有用户。2. 通过链式调用方法如where()和orderby()进行条件查询和排序,如$…

    2026年8月26日
    000
  • 如何利用Java使用ConcurrentHashMap处理并发

    ConcurrentHashMap因分段锁和CAS机制提升并发性能,支持原子操作如putIfAbsent、compute、merge,遍历时提供弱一致性视图,适用于高并发场景。 在多线程环境中,ConcurrentHashMap 是 Java 提供的一个高效且线程安全的 Map 实现。它比传统的 H…

    2026年8月26日
    000
  • java中文乱码在线转换 在线工具解决编码问题

    java中文乱码可以通过在线工具解决。1) 使用编码转换工具如convertio,将文件从一种编码转换为另一种。2) 使用编码检测工具如fileformat.info,识别未知编码的文件。3) 统一编码标准,使用版本控制和定期检查,确保编码一致性。 提到Java中文乱码在线转换和解决编码问题,我们首…

    2026年8月26日
    100
  • 什么是java Java编程语言全面介绍

    java是一个强大的编程语言,适用于从小型应用到大型企业级系统的开发。其核心特点包括:一次编写,到处运行:通过jvm实现跨平台运行。面向对象编程:支持类、对象、继承和多态,增强代码组织和灵活性。集合框架:提供如arraylist等工具,简化数据处理。丰富的生态系统:包括异常处理、多线程、lambda…

    2026年8月26日
    000
  • java中的实例是什么意思 实例与对象的概念辨析

    在java中,”实例”是某个类的具体实现,而”对象”是任何可以操作的实体。1.实例是通过new关键字创建的,如string s = new string(“hello”)中的s。2.对象包括所有实例和基本数据类型,如int sp…

    2026年8月26日
    100
  • 微信公众号小程序怎么做_微信公众号关联小程序开发教程

    微信公众号小程序怎么做_微信公众号关联小程序开发教程微信公众号小程序怎么做_微信公众号关联小程序开发教程微信公众号小程序怎么做_微信公众号关联小程序开发教程微信公众号小程序怎么做_微信公众号关联小程序开发教程

    先完成小程序开发与审核,再通过公众号后台授权绑定。需先注册开发者账号并认证公众号,创建小程序项目后使用微信开发者工具进行开发,提交审核通过后,在公众号后台关联小程序AppID,实现多入口展示与运营联动。 微信公众号关联小程序,核心在于先独立完成小程序的开发与审核,然后通过公众号后台进行简单的授权绑定…

    2026年8月26日 用户投稿
    100
  • UC浏览器视频小窗播放怎么用_UC浏览器视频小窗播放方法

    在UC浏览器播放视频时,按返回键或滑动退出可启用小窗模式;02. 若未自动开启,可通过菜单手动选择“小窗播放”;03. 小窗支持拖动、缩放与手势控制,便于多任务操作。 如果您在观看视频时希望同时浏览其他内容,可以使用UC浏览器的视频小窗播放功能,让视频以悬浮窗口的形式继续播放。该功能适用于移动端操作…

    2026年8月26日
    000
  • 从 ArrayList 中基于数量移除重复项的实用指南

    本文旨在提供一种从 `ArrayList` 中根据数量移除重复项的有效方法。针对包含具有数量属性的对象的 `ArrayList`,当需要根据用户输入的数量移除特定名称的项时,我们将介绍如何处理列表中同名项数量合并的问题。通过提供的代码示例,你将学会如何安全且高效地从列表中移除指定数量的重复项。 在处…

    2026年8月26日
    000
  • Java中线程组的概念 解析管理线程集合的方式

    Java中线程组的概念 解析管理线程集合的方式Java中线程组的概念 解析管理线程集合的方式Java中线程组的概念 解析管理线程集合的方式Java中线程组的概念 解析管理线程集合的方式

    不建议过度使用线程组的原因主要有两点:一是其层级结构固定,难以适应复杂并发场景;二是存在安全漏洞风险。1.executorservice提供了更灵活的线程池配置和管理方式,支持任务提交、取消和监控等功能。2.使用executorservice时,可通过executors.newfixedthread…

    2026年8月26日 用户投稿
    100
  • Java中FTP怎么操作 详解FTP客户端实现

    Java中FTP怎么操作 详解FTP客户端实现Java中FTP怎么操作 详解FTP客户端实现Java中FTP怎么操作 详解FTP客户端实现Java中FTP怎么操作 详解FTP客户端实现

    java中操作ftp的解决方案是使用apache commons net库。1.首先在maven或gradle项目中引入commons-net依赖;2.通过ftpclient类实现连接、上传、下载和删除文件等操作;3.建立连接时需指定服务器地址、端口、用户名和密码,并设置二进制传输模式及被动模式;4…

    2026年8月26日 用户投稿
    000
  • 微信公众号字体怎么改_微信公众号文章字体样式修改教程

    微信公众号字体怎么改_微信公众号文章字体样式修改教程微信公众号字体怎么改_微信公众号文章字体样式修改教程微信公众号字体怎么改_微信公众号文章字体样式修改教程微信公众号字体怎么改_微信公众号文章字体样式修改教程

    答案是微信公众号不支持自定义字体上传,但可通过字号、颜色、加粗、段落样式及第三方工具等现有功能,结合品牌化排版策略,在统一规范下提升文章视觉风格与阅读体验。 微信公众号文章的字体样式修改,说实话,并没有一个直接的“选择字体”菜单让你像Word那样随意切换成宋体、黑体或者其他个性化字体。它的核心在于通…

    2026年8月26日 用户投稿
    300

发表回复

登录后才能评论
关注微信