首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

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

今天我们聊聊一个大家可能觉得有点小争议的话题:为什么很多程序员宁愿多写几行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. switch和if...else在性能上的差异

有时候会有人担心,switch的执行效率是不是比if...else高。确实,在一些编译型语言里,编译器会把switch优化成跳转表来提高执行速度。简单说,跳转表让switch执行时间变得更短,适合处理大量的连续整数情况,比如游戏开发中的状态控制。

不过在大多数脚本语言(比如JavaScript)中,switch和if...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,别嵌套太深。代码嘛,不求炫技,只求简单明了。毕竟,能看懂的代码,才是好代码。

  • 发表于:
  • 原文链接https://page.om.qq.com/page/OG2Dbe2EQa3T6IKCcANpy3aw0
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券