条件与循环
这一课你将能做到
- 写出清晰的
if / else,并用「提前 return」减少嵌套
- 用
for 与 for...of 遍历数组,并知道为何别用 for...in 扫数组
- 读懂简单的三元表达式
? :,知道何时该改回 if
为什么要学
程序几乎都在做两件事:判断(够不够条件)和重复(列表每一项做一次)。
写得绕,自己下周也看不懂——所以我们强调「扁平、好读」。
评级、校验表单、渲染列表,全都是条件 + 循环的组合。
把分支写清楚,比背更多语法更重要。
先建立图像
如果(条件成立)→ 做 A
否则 → 做 B
重复:对列表里每一个 x → 做一件事
| 写法 | 适合 |
|---|
if / else if / else | 多数业务分支 |
三元 ? : | 很短的二选一赋值 |
for | 需要下标、或经典计数循环 |
for...of | 直接取数组元素(常用) |
while | 「不确定次数,直到某条件」 |
卫语句(提前 return):
先把「不合格」拦下并离开
后面只写「开心路径」
→ 嵌套变浅,好读好改
跟着做
步骤 1:if 与提前离开
控制台或脚本:
function canEnter(age) {
// 先拦无效 —— 卫语句
if (!Number.isFinite(age)) {
return "年龄无效";
}
if (age < 18) {
return "未成年,不能进入";
}
// 开心路径:到这里说明合法且成年
return "可以进入";
}
console.log(canEnter(20)); // 可以进入
console.log(canEnter(15)); // 未成年…
console.log(canEnter(NaN)); // 年龄无效
「提前 return」人话:不合格就马上结束,后面只写正常情况。比层层 else 好读。
步骤 2:三元(短判断)与何时别用
const age = 20;
const label = age >= 18 ? "成年" : "未成年";
console.log(label);
// 反例:套太多三元 → 难维护,请改 if
// const g = score >= 90 ? "A" : score >= 75 ? "B" : "C";
适合很短的二选一。逻辑一长,请改回 if。
步骤 3:经典 for 与 for...of
const lessons = ["HTML", "CSS", "JS"];
// 方式 A:需要下标时
for (let i = 0; i < lessons.length; i++) {
console.log(i, lessons[i]);
}
// 方式 B:直接取元素(更常用)
for (const title of lessons) {
console.log(title);
}
// 不推荐:用 for...in 遍历数组(会碰到非数字键、顺序坑)
// for (const k in lessons) { ... }
你应看到下标版打印 0 HTML 等,for...of 只打印标题。
步骤 4:break / continue
const nums = [1, 2, 3, 4, 5];
for (const n of nums) {
if (n === 3) continue; // 跳过 3,进入下一轮
if (n === 5) break; // 遇到 5 结束整个循环
console.log(n);
}
// 预期输出:1 2 4
break 跳出循环;continue 跳到下一轮。先会读,再按需用。
步骤 5:小页面——打分评级
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>条件与循环</title>
</head>
<body>
<input id="score" type="text" placeholder="0-100" />
<button type="button" id="go">评级</button>
<p id="out"></p>
<script>
function gradeOf(score) {
if (!Number.isFinite(score) || score < 0 || score > 100) {
return null; // 用 null 表示无效,交给调用方提示
}
// 顺序很重要:先判高分
if (score >= 90) return "A";
if (score >= 75) return "B";
if (score >= 60) return "C";
return "D";
}
document.getElementById("go").addEventListener("click", function () {
const score = Number(document.getElementById("score").value);
const out = document.getElementById("out");
const grade = gradeOf(score);
if (grade === null) {
out.textContent = "请输入 0-100 的数字";
return;
}
out.textContent = "等级:" + grade;
});
</script>
</body>
</html>
试:95→A,80→B,50→D,abc→提示无效。
步骤 6:循环渲染列表到页面
<ul id="ul"></ul>
<script>
const titles = ["变量", "运算符", "条件与循环"];
const ul = document.getElementById("ul");
for (const title of titles) {
const li = document.createElement("li");
li.textContent = title; // 改文本优先 textContent
ul.appendChild(li);
}
</script>
刷新后应看到三条列表。这是后面 DOM 课与数组课的预热:数据在数组里,循环生成界面。
讲清楚要点
- 因为嵌套越深越难读,所以用卫语句提前 return,把开心路径留在最后。
- 因为
else if 从上到下匹配,所以分数档位要先写高门槛再写低门槛。
- 因为数组是有序列表,所以遍历值用
for...of;需要下标再用经典 for。
- 因为
for...in 面向「可枚举键」,所以不要用它遍历数组。
- 因为三元只适合短表达式,所以分支一复杂就改回
if。
- 因为循环里改正在遍历的数组容易乱,所以初学先只读遍历;删改用数组方法或先收集再处理。
你可能会懵的地方
-
else if 顺序很重要
先判断 >=90 再 >=75。写反会逻辑错:90 可能被判成 B。
-
循环里改正在遍历的数组
下标会跳、会漏。初学先只读;要删元素可先 filter 出新数组。
-
开关语句 switch
适合「同一个变量多种固定取值」。先会 if 即可;需要时查 MDN,并记住多数情况要写 break。
-
while (true) 忘了 break
页面可能卡死。写循环前先想清楚结束条件。
错法对照
| 错法 | 问题 | 正解 |
|---|
| 箭头型深层 if | 难读难改 | 卫语句提前 return |
for...in 遍历数组 | 奇怪键、顺序坑 | for...of 或数组方法 |
| 三元套三元 | 难维护 | 改 if |
| 分数档位顺序写反 | 高等级永远进不去 | 先高后低 |
| 循环条件写错导致死循环 | 页面卡死 | 先写清结束条件再运行 |
自测三问
- 什么叫卫语句(提前 return)?举你写过的例子。
for 与 for...of 何时选哪个?
- 为何不建议用
for...in 遍历数组?
小结一句话
判断求清晰,循环求直接;用提前 return 压扁分支,遍历数组优先 for...of,档位判断注意顺序。
延伸