Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $YECBGYFECGEAFWHA as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2

Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $BBWFDDBHHYHDXXAB as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2
JavaScript剪刀石头布函数深度解析:正则表达式与三元运算符的巧妙应用_创想鸟

JavaScript剪刀石头布函数深度解析:正则表达式与三元运算符的巧妙应用

JavaScript剪刀石头布函数深度解析:正则表达式与三元运算符的巧妙应用

本文深入解析一个简洁的javascript剪刀石头布(rock-paper-scissors)游戏函数`rps`。我们将重点剖析其如何利用正则表达式(包含or运算符`|`)来匹配获胜组合,并结合三元运算符与字符串模板,以高度精炼的方式判断游戏结果,帮助读者理解javascript的基础特性及其在实际问题中的应用。

JavaScript剪刀石头布游戏函数解析

在JavaScript中,我们可以通过多种方式实现剪刀石头布(Rock-Paper-Scissors)游戏逻辑。以下是一个高度精简的实现示例,它巧妙地结合了箭头函数、三元运算符、字符串模板以及正则表达式来判断游戏结果:

const rps = (a, b) => a == b ? 'Draw!' : `Player ${/rp|ps|sr/.test(a[0]+b[0]) ? 2 : 1} won!`;

这个函数接收两个参数 a 和 b,分别代表两位玩家的出拳(”rock”、”paper” 或 “scissors”)。它的目标是返回游戏结果,例如 “Draw!”、”Player 1 won!” 或 “Player 2 won!”。接下来,我们将详细拆解这个函数的工作原理。

1. 箭头函数与基本结构

首先,rps = (a, b) => … 是一个ES6的箭头函数语法。它定义了一个名为 rps 的常量,其值为一个函数,该函数接收 a 和 b 两个参数。

函数体内部是一个顶级的三元运算符:a == b ? ‘Draw!’ : …

这部分非常直观:

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

如果 a 等于 b(即两位玩家出拳相同),则游戏结果为平局,返回字符串 ‘Draw!’。如果 a 不等于 b,则进入第二个分支,需要进一步判断胜负。

2. 核心胜负判断逻辑

当游戏不是平局时,函数会执行以下表达式:`Player ${/rp|ps|sr/.test(a[0]+b[0]) ? 2 : 1} won!`

这是一个字符串模板(使用反引号 ` 定义),它允许我们在字符串中嵌入表达式。其中最核心且需要理解的部分是 ${/rp|ps|sr/.test(a[0]+b[0]) ? 2 : 1}。

a. 组合玩家出拳的首字母

a[0]+b[0] 这部分是关键。它从每个玩家的出拳字符串中取出第一个字符并进行拼接。

例如,如果 a 是 “rock”,b 是 “paper”,那么 a[0] 是 ‘r’,b[0] 是 ‘p’,拼接后得到 “rp”。如果 a 是 “paper”,b 是 “scissors”,拼接后得到 “ps”。如果 a 是 “scissors”,b 是 “rock”,拼接后得到 “sr”。

b. 正则表达式 /rp|ps|sr/

接下来,a[0]+b[0] 的结果被用于与一个正则表达式进行匹配测试:/rp|ps|sr/。

这是一个正则表达式字面量,由 / 包裹。| 是正则表达式中的“或”运算符。它表示匹配 | 符号两边的任意一个模式。因此,/rp|ps|sr/ 意味着该正则表达式会尝试匹配 “rp”、”ps” 或 “sr” 中的任意一个字符串。

这些组合代表了玩家2获胜的所有情况:

“rp”: Rock (a) vs Paper (b) -> Paper 胜 Rock,Player 2 获胜。“ps”: Paper (a) vs Scissors (b) -> Scissors 胜 Paper,Player 2 获胜。“sr”: Scissors (a) vs Rock (b) -> Rock 胜 Scissors,Player 2 获胜。

c. .test() 方法

.test() 是正则表达式对象的一个方法,它用于测试一个字符串是否与该正则表达式匹配。

如果字符串匹配正则表达式,.test() 返回 true。如果字符串不匹配正则表达式,.test() 返回 false。

所以,/rp|ps|sr/.test(a[0]+b[0]) 会检查拼接后的两个首字母字符串(例如 “rp”)是否是 “rp”、”ps” 或 “sr” 中的一个。

d. 内部三元运算符 ? 2 : 1

.test() 方法的返回值(true 或 false)被用作另一个三元运算符的条件:… ? 2 : 1

如果 /rp|ps|sr/.test(a[0]+b[0]) 为 true(意味着是玩家2获胜的组合),则表达式返回 2。如果 /rp|ps|sr/.test(a[0]+b[0]) 为 false(意味着不是玩家2获胜的组合,且我们已经排除了平局,那么一定是玩家1获胜),则表达式返回 1。

3. 完整的字符串模板

最终,内部三元运算符的结果(1 或 2)被嵌入到字符串模板中,形成最终的游戏结果字符串。

如果返回 2,字符串变为 Player 2 won!。如果返回 1,字符串变为 Player 1 won!。

示例代码与运行结果

const rps = (a, b) => a == b ? 'Draw!' : `Player ${/rp|ps|sr/.test(a[0]+b[0]) ? 2 : 1} won!`;console.log(rps("rock", "rock"));     // Output: Draw!console.log(rps("rock", "paper"));    // Output: Player 2 won! (a[0]+b[0] = "rp", matches regex)console.log(rps("paper", "scissors")); // Output: Player 2 won! (a[0]+b[0] = "ps", matches regex)console.log(rps("scissors", "rock")); // Output: Player 2 won! (a[0]+b[0] = "sr", matches regex)console.log(rps("paper", "rock"));    // Output: Player 1 won! (a[0]+b[0] = "pr", does not match regex)console.log(rps("scissors", "paper"));// Output: Player 1 won! (a[0]+b[0] = "sp", does not match regex)console.log(rps("rock", "scissors")); // Output: Player 1 won! (a[0]+b[0] = "rs", does not match regex)

注意事项与总结

简洁性与可读性:这种实现方式非常简洁,对于熟悉JavaScript高级特性(如箭头函数、字符串模板和正则表达式)的开发者来说,其逻辑清晰且优雅。然而,对于初学者,特别是对正则表达式不熟悉的人,可能会觉得难以理解。正则表达式的强大:此例充分展示了正则表达式在模式匹配方面的强大能力。通过一个简单的模式 /rp|ps|sr/,就能够高效地判断所有玩家2获胜的场景。三元运算符的嵌套:函数中使用了嵌套的三元运算符,这在一定程度上增加了代码的紧凑性。合理使用三元运算符可以使代码更简洁,但过度嵌套可能会降低可读性。输入验证:这个函数假设输入 a 和 b 总是有效的 “rock”、”paper” 或 “scissors” 字符串。在实际应用中,通常需要添加额外的输入验证逻辑来处理无效输入,例如大小写不敏感处理或错误提示。学习价值:通过解析这个函数,我们可以深入理解JavaScript中箭头函数、字符串模板、三元运算符以及正则表达式这些核心概念的实际应用,这对于提升JavaScript编程技能非常有帮助。

以上就是JavaScript剪刀石头布函数深度解析:正则表达式与三元运算符的巧妙应用的详细内容,更多请关注创想鸟其它相关文章!

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

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
MongoDB高级聚合:构建多级关联查询获取完整数据视图
上一篇 2025年12月21日 12:36:54
JavaScript:从对象数组中提取具有唯一键值对的元素
下一篇 2025年12月21日 12:37:05

相关推荐

  • sublime怎么关闭拼写检查_sublime拼写检查功能关闭方法

    sublime怎么关闭拼写检查_sublime拼写检查功能关闭方法sublime怎么关闭拼写检查_sublime拼写检查功能关闭方法sublime怎么关闭拼写检查_sublime拼写检查功能关闭方法sublime怎么关闭拼写检查_sublime拼写检查功能关闭方法

    关闭Sublime Text拼写检查可点击状态栏Spell Check选择Disable Spell Check,或在用户设置中添加”spell_check”: false全局关闭,也可在语法专属设置中按文件类型禁用。 Sublime Text 的拼写检查功能有时会干扰代码编…

    2026年9月25日 • 用户投稿
    000
  • Java布尔方法逻辑陷阱:条件判断与预期行为不符的调试实践

    Java布尔方法逻辑陷阱:条件判断与预期行为不符的调试实践Java布尔方法逻辑陷阱:条件判断与预期行为不符的调试实践Java布尔方法逻辑陷阱:条件判断与预期行为不符的调试实践Java布尔方法逻辑陷阱:条件判断与预期行为不符的调试实践

    本文深入探讨Java中布尔方法因条件逻辑错误导致输出不符预期的常见问题。通过分析一个具体的kindaLiked方法示例,我们揭示了比较运算符使用不当如何影响程序行为。教程提供了详细的调试步骤、代码修正方案,并强调了编写精确条件判断、进行充分测试的重要性,以确保布尔方法返回正确的结果。 在软件开发中,…

    2026年9月25日 • 用户投稿
    000
  • Java布尔方法条件逻辑解析与预期行为校正

    Java布尔方法条件逻辑解析与预期行为校正Java布尔方法条件逻辑解析与预期行为校正Java布尔方法条件逻辑解析与预期行为校正Java布尔方法条件逻辑解析与预期行为校正

    本文旨在探讨Java中布尔方法条件表达式的常见误解,通过一个具体的kindaLiked()方法案例,详细分析代码逻辑与预期行为不符的原因。我们将演示如何精确定义条件,确保方法返回结果与业务逻辑一致,并提供示例代码、调试技巧及最佳实践,以帮助开发者编写更准确、可维护的布尔判断逻辑。 理解布尔方法与条件…

    2026年9月25日 • 用户投稿
    100
  • sublime怎么快速查看函数或类列表_sublime结构导航与符号浏览技巧

    sublime怎么快速查看函数或类列表_sublime结构导航与符号浏览技巧sublime怎么快速查看函数或类列表_sublime结构导航与符号浏览技巧sublime怎么快速查看函数或类列表_sublime结构导航与符号浏览技巧sublime怎么快速查看函数或类列表_sublime结构导航与符号浏览技巧

    使用Ctrl+R或Cmd+R打开“前往符号”面板,可快速定位函数和类;通过安装SideBarEnhancements等插件,在侧边栏查看文件符号树;配合LSP插件支持,使用F12实现“转到定义”跨文件跳转;自定义快捷键如Ctrl+Shift+R优化操作效率。 在使用 Sublime Text 编辑代…

    2026年9月25日 • 用户投稿
    300
  • 利用OSHI库监测与计算磁盘活动时间及传输速率

    利用OSHI库监测与计算磁盘活动时间及传输速率利用OSHI库监测与计算磁盘活动时间及传输速率利用OSHI库监测与计算磁盘活动时间及传输速率利用OSHI库监测与计算磁盘活动时间及传输速率

    本文详细介绍了如何利用Java OSHI库获取磁盘的活动时间与传输速率。通过HWDiskStore类的getReads()、getWrites()和getTransferTime()方法,结合时间间隔内的增量数据,可以精确计算出磁盘的活跃百分比和每秒传输次数。教程提供了示例代码,并逐步解析了数据采集…

    2026年9月25日 • 用户投稿
    000
  • 使用OSHI库精确测量磁盘活动时间和传输速率

    使用OSHI库精确测量磁盘活动时间和传输速率使用OSHI库精确测量磁盘活动时间和传输速率使用OSHI库精确测量磁盘活动时间和传输速率使用OSHI库精确测量磁盘活动时间和传输速率

    本文详细介绍了如何利用OSHI库的HWDiskStore类来精确测量磁盘活动时间百分比和数据传输速率。通过获取磁盘读写操作、总传输时间等累积性统计数据的快照,并计算两次快照之间的差值,可以准确分析特定时间段内的磁盘活跃度及每秒传输次数,从而有效监控系统磁盘性能。 OSHI库与磁盘性能监控 oshi(…

    2026年9月25日 • 用户投稿
    100
  • 如何在Java中使用Collections.shuffle打乱列表

    使用Collections.shuffle()可随机打乱列表元素,但列表必须为可变类型。Arrays.asList()返回固定列表,直接使用会抛出UnsupportedOperationException;正确做法是将其复制到ArrayList等可修改列表中再调用shuffle。基本用法示例如Lis…

    2026年9月24日
    300
  • vivo浏览器网页内容无法复制怎么办_vivo浏览器解除网页限制复制文本方法

    可通过阅读模式、打印预览、查看源代码、OCR识别或控制台命令五种方法解决网页内容无法复制问题,具体操作依次为:启用浏览器阅读模式后复制;利用打印预览界面选择文字;查看页面源代码搜索并提取文本;对截图使用图文识别功能获取文字;通过开发者工具控制台输入document.body.contentEdita…

    2026年9月24日
    400
  • sublime怎么配置eslint_sublime ESLint插件配置教程

    sublime怎么配置eslint_sublime ESLint插件配置教程sublime怎么配置eslint_sublime ESLint插件配置教程sublime怎么配置eslint_sublime ESLint插件配置教程sublime怎么配置eslint_sublime ESLint插件配置教程

    首先安装Node.js和ESLint,通过npm全局或项目内安装并初始化配置;接着在Sublime Text中使用Package Control安装SublimeLinter及SublimeLinter-eslint插件;然后根据需要在设置中配置ESLint可执行文件路径;再添加”&#8…

    2026年9月24日 • 用户投稿
    100
  • Java双向链表:实现高效的按索引删除节点操作

    Java双向链表:实现高效的按索引删除节点操作Java双向链表:实现高效的按索引删除节点操作Java双向链表:实现高效的按索引删除节点操作Java双向链表:实现高效的按索引删除节点操作

    本文详细讲解了如何在Java中为双向链表实现按索引删除节点的操作。教程涵盖了泛型设计、节点结构、参数校验、以及针对头节点、尾节点和中间节点的删除逻辑,并强调了维护链表head、tail和size等状态的准确性,确保了删除操作的健壮性和正确性。 1. 双向链表节点与泛型设计 在实现双向链表时,为了提高…

    2026年9月24日 • 用户投稿
    200
  • Java中实现跨类和函数共享变量的策略

    Java中实现跨类和函数共享变量的策略Java中实现跨类和函数共享变量的策略Java中实现跨类和函数共享变量的策略Java中实现跨类和函数共享变量的策略

    本文深入探讨了在Java中实现跨类和函数共享变量的有效策略。通过利用public static关键字,可以在不创建对象实例的情况下,使变量在整个应用程序中具备全局可访问性。文章将通过示例代码演示其使用方法,并提供关于此模式的注意事项与最佳实践,以帮助开发者理解其优势和潜在风险。 核心概念:publi…

    2026年9月24日 • 用户投稿
    100
  • sublime怎么设置代码片段(snippet)的触发词 _sublime snippet触发词设置

    sublime怎么设置代码片段(snippet)的触发词 _sublime snippet触发词设置sublime怎么设置代码片段(snippet)的触发词 _sublime snippet触发词设置sublime怎么设置代码片段(snippet)的触发词 _sublime snippet触发词设置sublime怎么设置代码片段(snippet)的触发词 _sublime snippet触发词设置

    在Sublime Text中设置代码片段触发词需编辑tabTrigger标签,2. 创建新片段并配置content、tabTrigger、scope等字段,3. 将文件保存为Packages/User/下的.sublime-snippet格式,4. 在对应语言文件中输入触发词后按Tab键即可展开。 …

    2026年9月24日 • 用户投稿
    100
  • Java 双向链表指定索引节点删除深度解析

    Java 双向链表指定索引节点删除深度解析Java 双向链表指定索引节点删除深度解析Java 双向链表指定索引节点删除深度解析Java 双向链表指定索引节点删除深度解析

    本文深入探讨了在 Java 中实现双向链表指定索引节点删除的完整过程。我们将详细讲解如何处理泛型化、头尾指针维护、链表大小更新以及各种边界条件(如删除头节点、尾节点、中间节点或唯一节点)的逻辑,并提供一个健壮的实现示例。 1. 双向链表基础与泛型化 双向链表是一种数据结构,其中每个节点不仅包含数据,…

    2026年9月24日 • 用户投稿
    100
  • 在Spring Boot中利用注解实现字符串到枚举的灵活转换

    在Spring Boot中利用注解实现字符串到枚举的灵活转换在Spring Boot中利用注解实现字符串到枚举的灵活转换在Spring Boot中利用注解实现字符串到枚举的灵活转换在Spring Boot中利用注解实现字符串到枚举的灵活转换

    本文详细介绍了在Spring Boot应用中,如何通过自定义Jackson反序列化器并结合@JsonDeserialize注解,实现请求体中字符串类型数据向枚举(Enum)对象的自动转换。该方法尤其适用于处理大小写不敏感的字符串输入,确保数据模型与业务逻辑的健壮性与灵活性。 背景与问题描述 在spr…

    2026年9月24日 • 用户投稿
    700
  • Java Optional与可空集合排序:深度解析与高效实践

    Java Optional与可空集合排序:深度解析与高效实践Java Optional与可空集合排序:深度解析与高效实践Java Optional与可空集合排序:深度解析与高效实践Java Optional与可空集合排序:深度解析与高效实践

    本文探讨了在Java中处理嵌套可空对象及列表排序的常见问题,特别是Optional的错误用法。强调了通过良好设计避免可空集合的重要性,并提供了在无法修改现有结构时,利用Stream.ofNullable()和Stream.mapMulti()进行安全高效排序的解决方案。旨在提升代码健壮性和可读性。 …

    2026年9月24日 • 用户投稿
    100
  • sublime怎么配置LSP(Language Server Protocol)_sublime语言服务器协议配置方法

    sublime怎么配置LSP(Language Server Protocol)_sublime语言服务器协议配置方法sublime怎么配置LSP(Language Server Protocol)_sublime语言服务器协议配置方法sublime怎么配置LSP(Language Server Protocol)_sublime语言服务器协议配置方法sublime怎么配置LSP(Language Server Protocol)_sublime语言服务器协议配置方法

    首先安装LSP插件,再配置语言服务器;以Python为例,通过pip安装pylsp并在LSP设置中添加客户端配置,保存后打开.py文件即可启用服务。 在 Sublime Text 中配置 LSP(Language Server Protocol)可以大幅提升代码补全、跳转定义、悬停提示等开发体验。下…

    2026年9月24日 • 用户投稿
    100
  • Java中自定义日志器的简化与自动化:避免重复声明

    Java中自定义日志器的简化与自动化:避免重复声明Java中自定义日志器的简化与自动化:避免重复声明Java中自定义日志器的简化与自动化:避免重复声明Java中自定义日志器的简化与自动化:避免重复声明

    本文探讨了在Java应用中,尤其是在不能使用Lombok或Spring等流行框架时,如何简化自定义日志器(如MXLogger)的声明和初始化。我们将介绍通过自定义工厂、基类继承和静态工具方法来减少重复代码,并深入分析在“简单Java”环境下实现纯注解驱动自动注入的复杂性,提供实用的解决方案。 挑战:…

    2026年9月24日 • 用户投稿
    100
  • Java密码验证与程序流程控制:实现用户输入校验与重试机制

    Java密码验证与程序流程控制:实现用户输入校验与重试机制Java密码验证与程序流程控制:实现用户输入校验与重试机制Java密码验证与程序流程控制:实现用户输入校验与重试机制Java密码验证与程序流程控制:实现用户输入校验与重试机制

    本文详细介绍了如何在Java应用程序中实现健壮的密码验证机制,并有效控制程序流程。通过整合循环结构和条件判断,我们能够强制用户输入符合要求的密码,支持多次尝试重输,或在达到最大尝试次数后终止程序,从而提升用户体验和系统安全性。 1. 密码验证逻辑概述 在许多应用程序中,密码验证是确保用户数据安全的关…

    2026年9月24日 • 用户投稿
    100
  • sublime怎么合并多行为一行_sublime快速合并多行文本技巧

    sublime怎么合并多行为一行_sublime快速合并多行文本技巧sublime怎么合并多行为一行_sublime快速合并多行文本技巧sublime怎么合并多行为一行_sublime快速合并多行文本技巧sublime怎么合并多行为一行_sublime快速合并多行文本技巧

    Sublime中合并多行为一行的方法包括:1. 使用Ctrl+J快捷键通过“Join Lines”功能快速合并,自动以空格连接;2. 用正则替换自定义连接符,如将r?n替换为逗号实现无空格合并;3. 安装Text Pastry插件实现高级合并,支持自定义分隔符。根据场景选择可显著提升编辑效率。 在使…

    2026年9月24日 • 用户投稿
    100
  • Rest Assured JSONPath 泛型值提取:构建可重用工具函数

    Rest Assured JSONPath 泛型值提取:构建可重用工具函数Rest Assured JSONPath 泛型值提取:构建可重用工具函数Rest Assured JSONPath 泛型值提取:构建可重用工具函数Rest Assured JSONPath 泛型值提取:构建可重用工具函数

    本教程探讨如何在Rest Assured中构建一个泛型工具函数,以实现从JSON响应中安全地提取指定类型的值。针对直接使用T.class的常见误区,文章提供了正确的解决方案:通过将Class作为参数传入,从而克服Java泛型类型擦除的限制,确保在运行时提供正确的类型信息,提升代码的灵活性和可重用性。…

    2026年9月24日 • 用户投稿
    100

发表回复

登录后才能评论
关注微信