首页
/ freeCodeCamp Basic JavaScript 课程精讲:用多个条件(三元)运算符实现多分支判断

freeCodeCamp Basic JavaScript 课程精讲:用多个条件(三元)运算符实现多分支判断

2026-09-07 19:30:47作者:余洋婵Anita

本文以 freeCodeCamp 开源课程 Basic JavaScript 板块的公开课程文件为核心,逐段讲解如何把 if / else if / else 多分支逻辑改写为链式三元表达式(multiple conditional operators),并结合仓库中该关卡的原文档、Schema 校验与课程结构文件进行佐证,帮助你同时掌握语法、可读性规范与自动化判题逻辑。

freeCodeCamp 的 JavaScript 基础课程由大量 .md 课程文件构成,每一份都按严格的 frontmatter 与章节模板组织。本教程面向的关卡是 Basic JavaScript 板块中的 Use Multiple Conditional (Ternary) Operators,其课程源文件位于 curriculum/challenges/english/blocks/basic-javascript/587d7b7e367417b2b2512b21.md。读者学习完毕后,将能独立完成"把多个 if/else 分支压缩为一条 return 语句"的重构,写出结构清晰、可读性良好的链式三元表达式,并理解 freeCodeCamp 用哪些测试约束来判定答案正确。

一、课程在 Basic JavaScript 板块中的位置与文件结构

在开始写代码前,先理解这份课程文件的定位。根据该文件的 frontmatter:

id: 587d7b7e367417b2b2512b21
title: Use Multiple Conditional (Ternary) Operators
challengeType: 1
forumTopicId: 301179
dashedName: use-multiple-conditional-ternary-operators

其中 challengeType: 1 在仓库的 packages/shared/src/config/challenge-types.ts 中对应 js = 1,属于"经典(classic)代码编写型"关卡:学习者直接在浏览器内置编辑器中补全函数,由测试自动判分;dashedName 用于生成 URL 锚点,forumTopicId 对应官方论坛讨论主题。这类课程文件的 YAML 头会被 curriculum/schema/challenge-schema.js 用 Joi 进行 schema 校验(idtitlechallengeType 为必填,dashedName 需匹配 slug 规则)。

关卡的整体顺序由 curriculum/structure/blocks/basic-javascript.json 中的 challengeOrder 描述。紧随本关卡之前的是单三元运算符课程 Use the Conditional (Ternary) Operator,其源文件为 curriculum/challenges/english/blocks/basic-javascript/587d7b7e367417b2b2512b24.md。也就是说,本关假设读者已经掌握 a ? b : c 的单层用法,接下来学习的是"把它串联起来判断多个条件"。

二、核心知识:什么是链式三元运算符

三元运算符(conditional operator)是一种表达式,而 if/else语句。正因为它是表达式,可以作为函数的返回值、也可以放进赋值语句中。单个三元运算符只能表达"二选一",当需要表达"多选一"时,可以把多个三元运算符串联(chain)起来,形成类似 else if 的效果。

以原课程文件中的经典函数 findGreaterOrEqual 为例,原始的多分支写法:

function findGreaterOrEqual(a, b) {
  if (a === b) {
    return "a and b are equal";
  }
  else if (a > b) {
    return "a is greater";
  }
  else {
    return "b is greater";
  }
}

使用多个条件运算符改写后:

function findGreaterOrEqual(a, b) {
  return (a === b) ? "a and b are equal"
    : (a > b) ? "a is greater"
    : "b is greater";
}

两种写法在语义上完全等价:首先判断 a === b,成立则返回第一个分支;否则再判断 a > b,成立返回第二个分支;都不成立则落入最后的 "b is greater"。阅读链式表达式时可把每一行当作一条规则"从上到下匹配,命中即停",这与 else if 的短路行为一致。

求值顺序与结合性细节

需要理解的是三元运算符的右结合性cond1 ? v1 : cond2 ? v2 : v3 实际被解析为 cond1 ? v1 : (cond2 ? v2 : v3)。也就是说,每个 : 之后的"假分支"可以再内嵌一个新的三元判断,从而形成一条判断链。同时,三元表达式只求值被选中的那一支,未被命中的分支里的代码不会执行——这一点与 if/else if 的惰性一致,不会产生多余副作用。

三、最佳实践:每个条件独占一行

freeCodeCamp 在本关明确指出一条编码规范:

It is considered best practice to format multiple conditional operators such that each condition is on a separate line.

也就是推荐把每个条件分成独立一行并保持缩进对齐:

function findGreaterOrEqual(a, b) {
  return (a === b) ? "a and b are equal"
    : (a > b) ? "a is greater"
    : "b is greater";
}

与之相对的"反面教材",是把所有内容挤在一行:

function findGreaterOrEqual(a, b) {
  return (a === b) ? "a and b are equal" : (a > b) ? "a is greater" : "b is greater";
}

这段代码功能上完全正确,但可读性显著下降:条件、分支和嵌套层级挤成一团,读者必须费力地数 ?: 才能理解判断树。在代码评审或团队协作场景中,这种写法很容易引入维护 Bug。官方推荐的换行格式让每个判断条件与结果对齐成"表格状",扫一眼即可把握全部分支。

四、动手实践:实现 checkSign

理解了链式写法后,课程给出了一道练习题(原文见课程的 # --instructions-- 部分):

In the checkSign function, use multiple conditional operators - following the recommended format used in findGreaterOrEqual - to check if a number is positive, negative or zero. The function should return positive, negative or zero.

要求把判断一个数字是正数、负数还是零的逻辑,用链式三元写成 checkSign 函数,返回值必须是字符串 positivenegativezero(注意大小写敏感)。编辑器中的初始种子代码(seed)为:

function checkSign(num) {

}

checkSign(10);

五、自动化测试如何逐条判定

freeCodeCamp 的经典关卡通过 # --hints-- 中的多组断言来判定通过与否。本关共有 4 条提示,可归纳为两类:结构约束行为验证

5.1 结构约束:必须真的使用三元运算符

第一条 hint 校验源码中是否出现了至少两个完整的 ?...:... 结构:

assert(/.+?\s*?\?\s*?.+?\s*?:\s*?.+?\s*?\?\s*?.+?\s*?:\s*?.+?/gi.test(__helpers.removeJSComments(code)));

该正则的核心意图是匹配"条件 ? 真值 : 假值"的完整三元结构出现两次及以上。注意其中调用了辅助函数 __helpers.removeJSComments(code)——即先剔除代码中的注释再做正则匹配。仓库 client/src/templates/Challenges/components/side-panel.test.tsx 中同样出现了对 __helpers.removeJSComments 的引用,说明该辅助函数是测试运行时环境中预置的常用工具。它的存在让判题规则更严谨:即使你在注释里写下 ? : 字样,也不会被误判为使用了三元运算符。

5.2 行为验证:三个典型输入

其余三条 hint 分别验证三类典型输入下的返回值:

assert(checkSign(10) === 'positive');
assert(checkSign(-12) === 'negative');
assert(checkSign(0) === 'zero');

由于测试在全局作用域直接调用 checkSign 函数并严格比较返回值(===),因此大小写必须完全一致:positivenegativezero。若返回 PositiveNegative 等变体,即使语义相同也会判错。种子代码末尾已写好调用 checkSign(10);,在浏览器环境中执行以便观察输出。

六、参考答案与逐步推导

课程文件自带的官方参考答案(# --solutions-- 部分)为:

function checkSign(num) {
  return (num > 0) ? 'positive' : (num < 0) ? 'negative' : 'zero';
}

推导思路如下:

  1. 先判断是否为正数:num > 0 成立 → 返回 'positive'
  2. 否则进入第二个条件:num < 0 成立 → 返回 'negative'
  3. 以上均不成立,说明 num === 0 → 返回 'zero'

若改写为等价的 if/else if/else,其形态为:

function checkSign(num) {
  if (num > 0) {
    return 'positive';
  } else if (num < 0) {
    return 'negative';
  } else {
    return 'zero';
  }
}

对照可知:链式三元是把"每个 return 分支"压缩为一行一分支的表达式写法,两种方案逻辑等价。由于测试要求"结构上使用多个条件运算符",仅用 if/else 实现虽然行为正确,仍无法通过第一条 hint。

七、进阶:何时使用链式三元,何时回到 if/else

链式三元并非万能,需要结合本关强调的可读性来权衡。freeCodeCamp 的教学目标很明确:让学习者掌握三元表达式的表达力(可作为返回值、赋值给变量、甚至参与模板字符串),同时学会通过换行缩进控制可读性。实践中可参考以下取舍原则:

  • 2~3 个分支且逻辑直观时,优先考虑链式三元,配合每行一个条件的排版;
  • 分支超过 3~4 个、或条件之间存在复杂的复合逻辑时,if/else if/else 往往更易读,也更便于插入注释与调试;
  • 链式三元适合"为同一变量/返回值挑选不同字面量"的场景(如本关的数字符号分类、常见的权限级别映射等);
  • 若存在"多条件复合判断"且有性能与副作用顾虑,应优先确认各分支只求值命中的一支,这通常意味着三元的惰性特性符合预期。

扩展演练:继续练习

在掌握本关之后,可自行尝试以下变体以巩固(可在本地 Node 环境运行,例如把函数定义保存为脚本后执行):

八、相关仓库资料速查

如果希望在本地进一步研究课程文件格式与判题机制,可重点阅读以下仓库路径:

综合来看,本关的完整学习闭环是:理解单三元 → 学会链式串联 → 遵守换行排版规范 → 通过结构正则与行为断言的双重校验。把 findGreaterOrEqualcheckSign 两段代码吃透并亲手运行一遍,链式三元运算符便会成为你日后处理多分支小逻辑时顺手可用的表达工具。

登录后查看全文
热门项目推荐
相关项目推荐

项目优选

收起
kernelkernel
deepin linux kernel
C
33
18
ops-transformerops-transformer
本项目是CANN提供的transformer类大模型算子库,实现网络在NPU上加速计算。
C++
1.14 K
2.75 K
pytorchpytorch
作为 Ascend for PyTorch 社区的核心组件,TorchNPU 是昇腾专为 PyTorch 打造的深度学习适配插件,使 PyTorch 框架能够直接调用昇腾 NPU,为开发者提供昇腾 AI 处理器的超强算力。
Python
857
1.35 K
docsdocs
暂无描述
Markdown
898
5.82 K
ops-nnops-nn
本项目是CANN提供的神经网络类计算算子库,实现网络在NPU上加速计算。
C++
921
1.84 K
jiuwenswarmjiuwenswarm
JiuwenSwarm 是一款基于openJiuwen开发的智能AI Agent,它能够将大语言模型的强大能力,通过你日常使用的各类通讯应用,直接延伸至你的指尖。
Python
3.8 K
1.02 K
kernelkernel
openEuler内核是openEuler操作系统的核心,既是系统性能与稳定性的基石,也是连接处理器、设备与服务的桥梁。
C
531
596
cann-learning-hubcann-learning-hub
CANN 学习中心仓,支持在线互动运行、边学边练,提供教程、示例与优化方案,一站式助力昇腾开发者快速上手。
Jupyter Notebook
1.02 K
519
ops-mathops-math
本项目是CANN提供的数学类基础计算算子库,实现网络在NPU上加速计算。
C++
1.36 K
1.46 K
AscendNPU-IRAscendNPU-IR
AscendNPU-IR是基于MLIR(Multi-Level Intermediate Representation)构建的,面向昇腾亲和算子编译时使用的中间表示,提供昇腾完备表达能力,通过编译优化提升昇腾AI处理器计算效率,支持通过生态框架使能昇腾AI处理器与深度调优
C++
548
391