为什么程序员都不喜欢使用switch,而是大量的 if……else if ?

文摘   2024-11-02 12:02   山西  
今天我们聊聊一个大家可能觉得有点小争议的话题:为什么很多程序员宁愿多写几行if...else if,也不喜欢用switch呢?🤔
先说一句啊,switch的设计初心其实是好的,原本是为了让代码结构更清晰、逻辑分支更明确。但现实生活中,很多小伙伴写代码时却经常避开它。
那么,我们就来拆解一下原因,看看大家为什么不爱用switch吧!

1. switch的局限性

switch的语法结构比较死板,它只支持精确匹配的分支,比如数值、字符和字符串类型。但一到复杂的条件判断,比如大于小于、不等式比较、范围判断等等,switch就显得捉襟见肘了。
来个例子:
let age = 25;

// 想判断不同年龄范围
if (age < 18) {
    console.log("未成年人");
else if (age >= 18 && age <= 60) {
    console.log("成年人");
else {
    console.log("老年人");
}
这种情况用switch就没法处理,因为它只能匹配具体的值,不能做范围判断。这就让if...else成为更灵活的选择。

2. switch的“隐性”Bug

switch的设计中有个坑,很多新手小伙伴都踩过:忘了写break。如果你少了break,代码会继续执行下一个case,这就是所谓的fall-through特性。虽然有时候这个特性有用,但多数情况下它让代码更难读,也更容易出错。
来个简单例子:
let color = "blue";

switch(color) {
    case "red":
        console.log("Color is red");
        break;
    case "blue":
        console.log("Color is blue");
        // 忘记写break
    case "green":
        console.log("Color is green");
        break;
}
上面这段代码的输出会是:
Color is blue
Color is green
很多初学者看到这里会一脸懵圈,“为啥蓝色之后还能输出绿色?”因为少了break啊朋友们!这种bug调试起来也特别麻烦,尤其当代码逻辑复杂的时候,谁也不想因为一个break搞得自己焦头烂额。😅

3. if...else更符合条件逻辑表达的直觉

if...else本质上是一种逻辑流程控制结构,它不仅可以实现条件匹配,还可以进行复杂逻辑的嵌套和组合。我们在业务开发中经常遇到的不是简单的匹配,而是各种复杂逻辑组合。
比如说一个用户权限判断,你可能会用类似这样的代码:
if (user.isAdmin) {
    console.log("管理员");
else if (user.isEditor && user.hasPermission) {
    console.log("编辑用户,有权限");
else if (user.isEditor && !user.hasPermission) {
    console.log("编辑用户,无权限");
else {
    console.log("普通用户");
}
要用switch写?好家伙,简直让人头大。👀

4. switch的维护成本高

当代码变得复杂时,switch语句往往需要我们一一列举所有可能的case,这在需求频繁变更的环境中就有点吃不消了。试想一下,需求每增加一种新情况,你都得往switch里加一个新的case,而且还得记得加break。改着改着,代码就不再简洁了。
if...else更灵活,当条件有变动时,你只需要在对应位置添加新的判断条件,不必遵循switch的严格结构。特别是在条件较多随时可能变更的场景下,if...else的可维护性更高。

5. 现代编程语言的新特性让switch更尴尬

很多新语言或者新版语言(比如ES6之后的JavaScript)都在优化if...else的语法,比如三元运算符可选链(Optional Chaining),甚至一些模式匹配特性。而这些新特性让if...else更强大,更简洁。
比如说,ES6之后,我们可以这样写:
let role = user.isAdmin ? "管理员" : (user.isEditor ? "编辑用户" : "普通用户");
这种写法不仅简洁,还避免了多层嵌套。而switch语法的“进化”相对缓慢,没有跟上语言发展的步伐。很多人觉得“与其用一个笨重的switch,不如直接用清晰的if...else”。

6. switchif...else在性能上的差异

有时候会有人担心,switch的执行效率是不是比if...else高。确实,在一些编译型语言里,编译器会把switch优化成跳转表来提高执行速度。简单说,跳转表让switch执行时间变得更短,适合处理大量的连续整数情况,比如游戏开发中的状态控制。
不过在大多数脚本语言(比如JavaScript)中,switchif...else的性能差距几乎可以忽略不计。对于大多数业务代码来说,这点微小的性能提升完全不足以弥补switch的缺陷。所以,说到底,性能并不是switch的杀手锏,if...else的可读性和灵活性更吸引人。🌱

那么switch就一无是处了吗?

也不能这么绝对,switch在某些场景下还是有用的。比如说,当你确实只需要单一条件的精确匹配,而且分支条件比较简单时,switch确实能让代码看上去更简洁。
例如:
let command = "start";

switch(command) {
    case "start":
        console.log("启动服务");
        break;
    case "stop":
        console.log("停止服务");
        break;
    case "restart":
        console.log("重启服务");
        break;
    default:
        console.log("未知命令");
}
在这种场景下,switch的代码块很清晰,一眼就能看明白不同命令对应的行为,这样的代码简洁明了,没有嵌套的层层逻辑,阅读起来也舒服。
所以啊,为什么程序员都更喜欢if...else呢?因为它确实更灵活,更符合我们日常写代码的习惯,能处理更多样化的条件判断,阅读起来也更直观。当然,switch也不是完全无用之物,在单一条件匹配的场景下,它依然是个不错的选择。
如果用switch,记得写break;如果用if...else,别嵌套太深。代码嘛,不求炫技,只求简单明了。毕竟,能看懂的代码,才是好代码。

-END-

ok,今天先说到这,老规矩,看完文章记得右下角给何老师点赞,

最后送给大家一个福利,我这里有一份搞副业的教程,这份教程里有100+个搞钱小项目:

网盘拉新核心玩法、公众号运营变现、小红书虚拟资料引流等,现在扫码加我微信,即可领取这份副业教程。

添加时备注:副业

程序媛山楂
5年+程序媛,专注于AI编程普及。本号主要分享AI编程、Chat账号、Chat教程、Sora教程、Suno AI、Sora账号、Sora提示词、AI换脸、AI绘画等,帮助解决各种AI疑难杂症。
 最新文章