用三元运算符 `?` 与逻辑或 `||` 重写 JavaScript 函数:checkAge 一行式改造实战
文档教程前端【免费下载链接】zh.javascript.info现代 JavaScript 教程The Modern JavaScript Tutorial以最新的 ECMAScript 规范为基准通过简单但足够详细的内容为你讲解从基础到高阶的 JavaScript 相关知识。项目地址https://gitcode.com/gh_mirrors/zh/zh.javascript.info点击查看免费下载本篇技术指南聚焦现代 JavaScript 教程The Modern JavaScript Tutorial中「函数基础」章节的一道经典课后习题不使用if、仅用一行代码将带if/else的checkAge(age)函数分别改写为三元运算符?与逻辑或||两个变体。文章将以官方解答为骨架结合本仓库中「函数」「逻辑运算符」「值的比较」「空值合并运算符」等章节的原始资料逐行拆解两种改写方案的执行原理、运算符优先级细节与常见误区读完你不仅能独立完成这类「用表达式替代语句」的重构还能准确判断||、??、在该场景下各自适用与否。任务回顾待重写的 if/else 版本习题原文位于 2-rewrite-function-question-or/task.md其初始函数如下function checkAge(age) { if (age 18) { return true; } else { return confirm(Do you have your parents permission to access this page?); } }函数行为分两条路径若参数age大于18直接返回布尔值true否则调用confirm(...)弹出确认框并把用户的选择布尔值作为结果返回。题目要求保持效果完全相同不使用if且只需一行代码分别写出两个变体使用问号运算符三元/条件运算符?使用或运算符||。官方解答见 2-rewrite-function-question-or/solution.md。下面逐一展开。变体一用三元运算符?function checkAge(age) { return (age 18) ? true : confirm(Did parents allow you?); }三元运算符condition ? A : B的语义是condition为真时求值并返回A为假时求值并返回B。这里condition就是比较表达式age 18因此age 18为true→ 返回字面量trueage 18为false→ 执行confirm(...)并把确认结果返回。这与原if/else版本完全等价且把两条return路径压缩进了同一个表达式。confirm()本身返回布尔值确定返回true取消返回false所以?的两个分支产出的类型一致都是boolean。变体二用逻辑或||最短的变体function checkAge(age) { return (age 18) || confirm(Did parents allow you?); }这个写法初看有些反直觉为什么一个「或」表达式能代替分支答案在于 JavaScript 的||并不是传统意义上「只返回布尔值」的运算符。在 逻辑运算符 一章中明确给出了||的完整算法从左到右依次计算操作数处理每个操作数时将其转为布尔值若结果是true立即停止计算并返回该操作数的原始值不做布尔转换若所有操作数都计算完全部为假值则返回最后一个操作数。也就是说a || b等价于「返回第一个真值若没有真值则返回最后一个值」。对应到checkAge当age 18为true时||短路求值直接返回比较结果true右侧的confirm(...)根本不会被执行——这正是短路求值short-circuit evaluation的体现当age 18为false假值时||继续求值右侧执行confirm(...)并返回其布尔结果。可见第二个变体同时借助了两个语言特性||的「返回第一个真值」规则与「短路求值」行为。它在三个候选方案中代码最短因此官方解答称其为「最短的变体」。两种写法为什么严格等价要确认两个变体与原if/else版本「效果相同」关键在于两点比较表达式age 18的结果类型是布尔值。如 值的比较 一章所述JavaScript 的所有比较运算符均返回布尔值true/false不会返回其他类型。这正是||变体能够成立的前提左侧操作数的「原始值」恰好就是布尔值本身所以短路时返回的true与?变体显式写出的true字面量完全一致。confirm(...)返回布尔值。无论用户点确定还是取消返回值都非真即假因此它作为||的右侧操作数、或?的false分支产出的都是合法、类型一致的返回结果。把三个版本放进一张等价表输入if/else 版本?变体||变体age 18返回true返回true短路返回trueage 18且用户确认返回confirm()结果true执行confirm()并返回执行confirm()并返回age 18且用户取消返回confirm()结果false执行confirm()并返回执行confirm()并返回三种实现的行为完全一致。运算符优先级与括号可省但建议保留官方解答特别提醒此处不需要给age 18加括号写上括号只是为了提高可读性。这背后的依据是运算符优先级。在 基础运算符 一章的优先级表中关系/比较运算符优先级较高先于三元运算符?求值同时也先于||求值||的优先级很低仅高于赋值与??同级详见 空值合并运算符 的优先级小节。因此age 18 ? true : confirm(...)会被解析为(age 18) ? true : confirm(...)age 18 || confirm(...)会被解析为(age 18) || confirm(...)——引擎天然按期望分组括号并非语法必需。但正如官方解答所说显式加上括号能让阅读者一眼看出「比较」是整体降低误读概率属于推荐的工程习惯。需要警惕的是当表达式更复杂例如混合算术运算*、时由于这些运算符优先级高于||/??省略括号会得到完全不同的分组结果此时括号就变成必需项了可参考 空值合并运算符 中height ?? 100 * width ?? 50的错误示例。边界与误区这里为什么不能用??有读者可能会想既然要「提供默认值/兜底」能不能用空值合并运算符??写(age 18) ?? confirm(...)答案是否定的且原因值得专门说明。??的语义是「返回第一个已定义非null/undefined的值」它不会对false、0、等假值进行兜底。而这里恰好需要的是「真值判定」当age 18为false时必须继续执行confirm(...)。若换成??由于age 18永远返回布尔值既非null也非undefined即「已定义」??会直接返回这个比较结果confirm(...)永远不会被调用函数行为彻底改变。这正是||区分真值与??区分 null/undefined的根本差异详见 空值合并运算符 的「与 || 比较」一节。同理也不适用于本题(age 18) confirm(...)在age 18为假时返回false而非执行确认无法还原「否则返回确认结果」的分支逻辑。在选择替代运算符时务必先确认你需要的兜底语义是「假值」还是「null/undefined」。延伸串联同一章节的相邻习题这道题并非孤立存在它与「函数基础」章节的其他习题构成了完整的能力闭环1-if-else-required同样针对checkAge探讨「删除else后行为是否变化」。结论是没有区别——因为if分支里是return true一旦命中即退出函数紧随其后的return confirm(...)只会在条件为假时执行。理解这一点是理解「语句式提前返回」与「表达式式短路」等价性的前提。3-min要求写出min(a, b)的最小值函数同样可以训练用表达式替代分支。4-pow实现pow(x, n)幂运算进一步巩固函数声明、参数与return的组合运用。这些习题统一收录于 15-function-basics 章节其正文系统讲解了函数声明、局部/外部变量、参数与默认值、返回值以及「一个函数只做一件事」的命名与设计原则建议结合阅读从「会写重写」进阶到「理解函数在 JavaScript 中作为构建块的设计哲学」。总结围绕checkAge的一行式重写核心结论可以归纳为四点?变体return (age 18) ? true : confirm(Did parents allow you?);显式、直白两个分支一目了然||变体return (age 18) || confirm(Did parents allow you?);最短依赖||「返回第一个真值 短路求值」的规则且因为比较与confirm的结果均为布尔值二者严格等价括号可省但建议保留优先级由引擎保证先于?与||加括号只为可读性勿滥用替代运算符??只区分 null/undefined、返回第一个假值二者都无法还原本题的分支语义——选运算符先想清楚你要的兜底语义。掌握这道题你便同时掌握了 JavaScript 中「表达式化重构」「短路求值」与「运算符优先级」三个高频考点它们会在日常代码精简与代码评审中反复出现。赞分享文档教程前端【免费下载链接】zh.javascript.info现代 JavaScript 教程The Modern JavaScript Tutorial以最新的 ECMAScript 规范为基准通过简单但足够详细的内容为你讲解从基础到高阶的 JavaScript 相关知识。项目地址https://gitcode.com/gh_mirrors/zh/zh.javascript.info点击查看免费下载相关推荐JavaScript 函数重写实战用三元运算符与 || 精简 checkAge 条件分支JavaScript 函数重写实战用三元运算符与 || 精简 checkAge 条件分支 本文基于 Modern JavaScript Tutorial 仓库文档/教程前端JavaScript 函数重构实战用 ? 三元运算符与 || 短路求值重写 if/elseJavaScript 函数重构实战用 ? 三元运算符与 || 短路求值重写 if/else 导读本教程来自现代 JavaScript 教程en.javas文档/教程前端JavaScript 条件分支改写实战把 if..else 链重写为多重三元运算符?JavaScript 条件分支改写实战把 if..else 链重写为多重三元运算符? 导读 在 JavaScript 中 if..else 分支与三文档/教程前端上一篇pixi upload prefix 完全指南Conda 包上传 prefix.dev 的命令选项、认证与实现原理下一篇Display Driver Uninstaller (DDU)硬件驱动深度清理的技术实践指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

Ubuntu 22.04下2080Ti双卡NVLink实战配置指南

Ubuntu 22.04下2080Ti双卡NVLink实战配置指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 10:31:25 阅读更多 →
Go 与 Linux 网络命名空间:基于 CNI `ns` 包的安全切换实践(KubeVirt 视角)

Go 与 Linux 网络命名空间:基于 CNI `ns` 包的安全切换实践(KubeVirt 视角)

云原生 【免费下载链接】kubevirt Kubernetes Virtualization API and runtime in order to define and manage virtual machines. 项目地址: https://gitcode.com/gh_mirrors/ku/kubevirt 点击查看 免费下载 导读 Linux 中每个 OS 线程都可以拥有独立的网络命名空…

2026/10/7 7:59:56 阅读更多 →
为什么有的 NVMe SSD 有 DRAM,有的没有?——NVMe SSD 的 DRAM 缓存机制详解

为什么有的 NVMe SSD 有 DRAM,有的没有?——NVMe SSD 的 DRAM 缓存机制详解

文档教程技术博客大模型人工智能 【免费下载链接】one-small-step 这是一个简单的技术科普教程项目,主要聚焦于解释一些有趣的,前沿的技术概念和原理。每篇文章都力求在 5 分钟内阅读完成。 项目地址: https://gitcode.com/gh_mirrors/on/one…

2026/10/7 8:01:23 阅读更多 →

最新新闻

深入拆解RoCE网络:PFC、ECN与DCQCN机制与调优

深入拆解RoCE网络:PFC、ECN与DCQCN机制与调优

最近半年我接了不少RoCE网络的排障和优化需求,有做存储的、有跑AI训练的,从100G到400G都有。说实话,大部分问题的根源不是网卡也不是交换机硬件性能,而是大家对RoCE这套机制“七分懂三分不懂”:知道要开PFC&#xff0c…

2026/10/7 10:31:09 阅读更多 →
JSP+Servlet+JDBC学生信息管理系统:分页搜索与CRUD实战

JSP+Servlet+JDBC学生信息管理系统:分页搜索与CRUD实战

简介:面向Java Web课程设计与期末作业的学生信息管理系统项目包,涵盖登录验证、学生信息增删改查、课程关联等典型功能,适合正在学习Servlet/JSP、MVC分层架构与数据库编程的初学者。压缩包共209个文件,大小仅4.57MB,包…

2026/10/7 10:31:09 阅读更多 →
Android电子书阅读系统实战:SpringBoot后端与移动端全栈开发解析

Android电子书阅读系统实战:SpringBoot后端与移动端全栈开发解析

1. 项目概述 接手这个基于Android的电子书阅读系统时,我的第一反应是:这又是一个典型的Java全栈毕业设计项目,后端SpringBoot负责业务逻辑,前端Android负责展示交互,再加一套完整的源码文档视频配套。但真正动手做完之…

2026/10/7 10:31:09 阅读更多 →
AI视频补帧后怎么调色

AI视频补帧后怎么调色

AI视频补帧完成后,调色的核心思路是先确认补帧结果是否稳定,再针对补帧带来的色彩变化做校正,最后匹配整体风格。如果补帧已经产生明显的形变或伪影,优先处理源素材而非通过调色掩盖问题。剪映专业版已确认提供基础调色和AI色彩匹…

2026/10/7 10:31:09 阅读更多 →
纯内网开发环境搭建:SSH密钥、跳板机与VSCode Remote-SSH离线部署实战

纯内网开发环境搭建:SSH密钥、跳板机与VSCode Remote-SSH离线部署实战

最近公司把整个研发网完全隔离了,新同事入职后光是把开发环境拉起来就折腾了大半个星期。问得最多的就是一套组合拳:内网里怎么用MobaXterm连跳板机、再跳开发机,以及VSCode到底怎么才能远程写代码。这些实操我基本都趟过一遍,趁热…

2026/10/7 10:31:09 阅读更多 →
x64代码注入实战:从x86迁移到Windows 11的完整复现指南

x64代码注入实战:从x86迁移到Windows 11的完整复现指南

手头这本《逆向工程核心原理》我翻了不止一遍。书里“代码注入”那一章,当年在 Win7 的 32 位虚拟机上跑通时,MessageBox 从目标进程弹出来的瞬间,确实有“看懂黑魔法”的错觉。最近想把这套实验原封不动搬到 64 位 Windows 11 上&#xff0c…

2026/10/7 10:30:08 阅读更多 →

日新闻

ROS2机械臂仿真与运动控制:从URDF建模到Gazebo实战全解析

ROS2机械臂仿真与运动控制:从URDF建模到Gazebo实战全解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 1:01:58 阅读更多 →
用浏览器直接改ESP32的WiFi密码:NVS键值配置工具设计与实现

用浏览器直接改ESP32的WiFi密码:NVS键值配置工具设计与实现

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 1:02:00 阅读更多 →
芯片封装缺陷检测:扫描声学显微镜(SAT)原理与实操指南

芯片封装缺陷检测:扫描声学显微镜(SAT)原理与实操指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 1:02:00 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/6 7:15:40 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/6 5:29:09 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 9:29:10 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/6 8:21:32 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/6 4:21:51 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/6 1:18:13 阅读更多 →