第四章:流程控制——if-else、switch-case、三元运算符的实战应用
流程控制,说白了就是让代码「学会做选择」。
我刚开始写 JavaScript 时,觉得这玩意儿不就是判断一下条件嘛,有啥难的?结果写出来的代码又臭又长,自己都不想看第二遍。后来踩的坑多了,才慢慢摸到门道。
今天咱们就把 if-else、switch-case、三元运算符这三个家伙彻底聊透。我会把我在项目中用它们的真实场景、踩过的坑、以及什么时候该用哪个,统统告诉你。
4.1 if-else:最基础也最常用的判断
if-else 是流程控制的「老大哥」。你写任何逻辑,几乎都离不开它。
4.1.1 基本语法
let score = 85;
if (score >= 90) {
console.log('优秀');
} else if (score >= 80) {
console.log('良好');
} else if (score >= 60) {
console.log('及格');
} else {
console.log('不及格');
}
// 输出:良好
嗯,这里要注意:else if 中间是有空格的,不是 elseif。我见过不少新手在这上面栽跟头。
4.1.2 条件判断的「坑」
我在项目中遇到过一个问题:用户输入年龄,我判断是否成年。代码写的是:
let age = '18';
if (age == 18) {
console.log('成年了');
}
// 输出:成年了
看起来没问题对吧?但 == 会做类型转换,字符串 '18' 和数字 18 被当成相等。如果用户输入的是 '18abc',结果还是 true!
== 而不是 ===,导致一个支付系统的金额判断出了 bug。用户输入 '100' 和数字 100 被当成一样,但实际业务上字符串和数字是两种不同的数据来源。从那以后,我所有条件判断一律用 ===。
4.1.3 嵌套 if 的「扁平化」技巧
你想想看,如果条件嵌套太多层,代码读起来是不是很痛苦?
// 糟糕的写法
if (user) {
if (user.isLogin) {
if (user.role === 'admin') {
console.log('欢迎管理员');
}
}
}
// 更好的写法——提前返回
if (!user) return;
if (!user.isLogin) return;
if (user.role === 'admin') {
console.log('欢迎管理员');
}
我个人习惯用「提前返回」的方式,把嵌套拆平。代码行数没少,但可读性翻倍。
4.2 switch-case:多分支场景的利器
当你要判断的值是固定的几个选项时,switch-case 比 if-else 更清晰。
4.2.1 基本用法
let day = 3;
let dayName;
switch (day) {
case 1:
dayName = '周一';
break;
case 2:
dayName = '周二';
break;
case 3:
dayName = '周三';
break;
case 4:
dayName = '周四';
break;
case 5:
dayName = '周五';
break;
default:
dayName = '周末';
}
console.log(dayName); // 周三
4.2.2 别忘了 break!
switch-case 最经典的坑就是「穿透」。如果你忘了写 break,代码会继续往下执行。
let fruit = '苹果';
switch (fruit) {
case '苹果':
case '香蕉':
case '橙子':
console.log('这是水果');
break;
case '白菜':
case '萝卜':
console.log('这是蔬菜');
break;
default:
console.log('不知道是什么');
}
// 输出:这是水果
你看,苹果、香蕉、橙子都走同一个逻辑。这种写法比 if-else 的多个 || 条件要清爽得多。
4.2.3 switch 的「严格比较」
switch 用的是 === 比较,不是 ==。这一点很多人不知道。
let value = '1';
switch (value) {
case 1:
console.log('数字1');
break;
case '1':
console.log('字符串1');
break;
default:
console.log('其他');
}
// 输出:字符串1
嗯,这里要注意:如果你用 == 的话,数字 1 和字符串 '1' 会被当成相等,但 switch 不会。这其实是个好事,避免了隐式类型转换带来的坑。
4.3 三元运算符:简洁的「二选一」
三元运算符是 if-else 的「语法糖」。它让简单的二选一变得非常简洁。
4.3.1 基本语法
let age = 20;
let status = age >= 18 ? '成年' : '未成年';
console.log(status); // 成年
说白了就是:条件 ? 真值 : 假值。一行搞定。
4.3.2 什么时候用三元?
我个人习惯是:条件简单、结果也简单的时候用三元。比如:
- 给变量赋值
- 在模板字符串中做判断
- 在 JSX 中做条件渲染
// 模板字符串中使用
let isVIP = true;
console.log(`欢迎${isVIP ? '尊贵的VIP' : '普通'}用户`);
// 函数返回值
function getDiscount(level) {
return level === 'gold' ? 0.8 : 0.9;
}
4.3.3 三元的「禁区」
// 别这么写!可读性极差
let result = a ? (b ? (c ? 'A' : 'B') : (d ? 'C' : 'D')) : 'E';
这种嵌套三元,说白了就是「炫技」。我自己看着都头疼,更别说维护了。遇到复杂逻辑,老老实实用 if-else 或者 switch。
4.4 实战对比:什么时候用哪个?
我整理了一个表格,方便你快速决策:
| 场景 | 推荐用 | 原因 |
|---|---|---|
| 简单的二选一 | 三元运算符 | 一行搞定,简洁明了 |
| 2-3 个分支 | if-else | 可读性好,容易扩展 |
| 多个固定值判断 | switch-case | 结构清晰,避免重复条件 |
| 复杂条件(&&、|| 组合) | if-else | 三元和 switch 都搞不定 |
| 需要「穿透」效果 | switch-case | 这是 switch 的独门绝技 |
4.5 一个完整的实战案例
咱们来写一个「用户权限判断」的小功能。假设系统有三种角色:admin、editor、viewer。不同角色能看到不同的内容。
function getDashboard(role) {
// 先做简单的校验
if (!role) {
return '请先登录';
}
// 用 switch 处理多分支
switch (role) {
case 'admin':
return '管理后台:用户管理、内容管理、系统设置';
case 'editor':
return '编辑后台:内容管理、发布文章';
case 'viewer':
return '查看后台:仅浏览内容';
default:
return '未知角色,请联系管理员';
}
}
// 使用三元做简单判断
let isLoggedIn = true;
let message = isLoggedIn ? getDashboard('editor') : '请先登录';
console.log(message);
// 输出:编辑后台:内容管理、发布文章
你看,这个例子把 if-else、switch-case、三元都用上了。各司其职,代码读起来很舒服。
好了,流程控制这块就聊到这儿。说白了就是三个工具,用对场景才是关键。下一章咱们聊聊循环,那又是另一番天地了。