每个实用的程序最终都会遇到决策点。这个按钮应该是提交表单还是显示错误?这个用户应该看到管理员仪表板还是访客视图?JavaScript 通过条件语句来回答这些问题。它们是代码的控制阀:根据表达式评估结果是 true 还是 false,来开启一条路径或关闭另一条路径。如果没有它们,你的脚本将只会从上到下机械地运行,而永远无法对用户做出反应。
最简单的分支:if
if 语句是你首先要经过的大门。你在括号内放置一个条件。如果该条件解析为 true,则执行下方的代码块。如果解析为 false,JavaScript 会完全跳过该代码块并继续执行文件中的后续内容。
这正是进行简单的、一次性检查时所需要的。想象一下在向服务器发送任何内容之前验证表单字段:
const email = document.getElementById("email").value;
if (email === "") {
alert("Please enter your email.");
}
没有 email,就没有提交。逻辑直接且清晰。当只需要针对一种特殊情况进行防护且不需要备选操作时,请使用 if。
处理二选一:if...else
大多数真实的决策都有两面。if...else 组合恰好涵盖了这一点。当条件为真时运行一个代码块,当条件为假时运行另一个。这两条路径是互斥的。
设想一下在页面加载时进行深色模式检查:
const prefersDark = window.matchMedia("(prefers-color-scheme: dark)").matches;
if (prefersDark) {
document.body.classList.add("dark");
} else {
document.body.classList.add("light");
}
浏览器永远不会同时添加这两个类。它会选择一条路径,执行它,然后继续。每当你的逻辑清晰地分为两种可能的结果时,这就是你应该使用的结构。
多条路径:if...else if...else
并非所有问题都是二元的。有时你需要一个可能性的阶梯。if...else if...else 链允许你按顺序测试多个条件。JavaScript 从上到下评估它们,并运行第一个条件为真的代码块。一旦匹配成功,阶梯的其余部分将被忽略。
一个经典的例子是将数字分数映射为字母等级:
const score = 87;
let grade;
if (score >= 90) {
grade = "A";
} else if (score >= 80) {
grade = "B";
} else if (score >= 70) {
grade = "C";
} else {
grade = "F";
}
在这里,顺序至关重要。如果你在检查 score >= 90 之前先检查 score >= 70,那么几乎所有及格的分数都会被困在 C 这一档中,因为第一个匹配成功的条件会胜出。请务必按照从最具体到最不具体的顺序排列条件,并始终在链的末尾使用最后的 else 来捕获任何遗漏的情况。
匹配固定值:switch
当你将一个变量与一系列已知常量进行比较时,冗长的 if...else 链会变得杂乱无章。switch 语句可以使事情变得简洁。它只评估一次表达式,然后使用严格相等 (===) 将其与 case 标签进行比较。当选项是离散且有名称时,这会让代码更易于阅读。
考虑根据当前日期设置商店营业时间:
const day = new Date().getDay();
switch (day) {
case 0:
console.log("Sunday hours: 10am - 4pm");
break;
case 6:
console.log("Saturday hours: 9am - 6pm");
break;
default:
console.log("Weekday hours: 8am - 8pm");
}
请务必小心使用 break。如果你省略了它,执行会“穿透”到下一个 case 并继续运行。这种行为偶尔有用,但更多时候会导致隐蔽的 Bug。如果使用得当,switch 可以让你一眼看清意图,并将相关的分支整齐地排列在一列中。
紧凑的决策:三元运算符
三元运算符——写作 ? :——是一个表达式,而不是一个语句。这个区别非常重要
