条件语句

JS 的条件语句不太多,就 ifswitch 两个,不过他们的使用方式也可以算是眼花缭乱了。

if 语句

if 字面意思:如果 xxx。程序中的用法也是这样,如果条件为真,则执行执行代码块,反之则不执行。

语法:

if (条件) {
// 条件为真时执行
} else if (其他条件) {
// 前一个条件为假且当前条件为真时执行
} else if (其他条件) {
// 前面所有条件为假且当前条件为真时执行
} else {
// 所有条件均为假时执行
}

基础用法:

if (true) {
console.log('条件为真执行代码块');
}
// 如果代码块中只有一个语句,可以省略花括号
if (true) console.log('条件为真执行代码块');

if & else 用法:

const age = 20;
if (age < 18) {
console.log('未成年');
} else {
console.log('成年人');
}
// 也可省略花括号
if (age < 18) console.log('未成年');
else console.log('成年人');

完整示例:

const age = 20;
if (age < 18) {
console.log('未成年');
} else if (age >= 18 && age < 50) {
console.log('成年人');
} else if (age >= 50 && age < 65) {
console.log('中年人');
} else {
console.log('老年人');
}

虽然 if 条件语句的语法上支持省略花括号,但在实际编码中,还是不太建议这么做,代码可读性降低,导致维护成本增加。

switch 语句

switch 语句和 if 语句很像,都用于条件判断,但 switch 语句中不支持条件表达式,case 后面只能是一个值或者运算表达式。

使用时特别注意 break 关键字,如果少了这个,您的代码会出大篓子。

使用 switch 语句:

const fruit = 'apple';

switch (fruit) {
case 'apple':
console.log('苹果');
break;
case 'banana':
console.log('香蕉');
break;
case 'orange':
console.log('橘子');
break;
default:
console.log('其他水果');
break;
}

以下代码错误写法,将始终都是 default 分支:

const age = 20;
switch (age) {
case age < 18:
console.log('未成年');
break;
case age >= 18 && age < 50:
console.log('成年人');
break;
case age >= 50 && age < 65:
console.log('中年人');
break;
default:
console.log('老年人');
}

但可以这样用:

const fruit = 'apple';
const apple = 'apple';
switch (fruit) {
case apple: // 可以使用变量
console.log('苹果');
if (true) { // case 中可以使用条件语句
console.log('进入条件语句');
}
break;
case 'ban' + 'ana': // 可以使用运算符
console.log('香蕉');
break;
default:
console.log('其他水果');
break;
}

使用 switch 语句时,如果少了 break 关键字,就触发了神奇的 case 穿透 问题。看例子:

const fruit = 'apple';

switch (fruit) {
case 'apple':
console.log('苹果');
// 没有 break,代码会走到下一个 case
case 'banana':
console.log('香蕉');
// 依然没有 break,继续往下走
case 'orange':
console.log('橘子');
// 仍然没有 break,继续
default:
console.log('其他水果');
// switch 结束了
}

以上代码会同时输出:

苹果
香蕉
橘子
其他水果

if 优化

代码中免不了会出现很多 if 判断情况,如果代码组织能力太差,那就像捅了 if 窝一样~~

看一个在曾经项目中前辈写的代码:

if (score.length != 0) {
if (score >= 0 && score <= 10) {
if (res1.status === '1') {
if (res2.status === '1') {}
if (viewShow) {
} else {}
} else {}
} else {}
} else {}

这样的代码看起来舒服吗?反正我不舒服,真的太丑了,一层层的嵌套,像是走到逻辑地狱一样!!

使用卫语句优化

善用 return 优化 if 语句,提前处理异常或简单条件,减少嵌套层级。

优化前的代码:

function checkOrder(order) {
if (order.isValid) {
if (order.items.length > 0) {
if (order.total > 0) {
// 核心逻辑
return '1';
} else {
return '2';
}
} else {
return '3';
}
} else {
return '4';
}
}

卫语句优化后:

function checkOrder(order) {
if (!order.isValid) {
return '4';
}
if (order.items.length === 0) {
return '3';
}
if (order.total <= 0) {
return '2';
} return '1';
}

使用策略模式优化

策略模式 属于设计模式中的一种,通往超神路上,设计模式可以算是一道拦路虎,好的设计模式可以写出更优雅的代码。

在 JS 这个语言中,使用对象可以轻松的实现策略模式,优化不必要的 if 语句。

优化前的代码:

function getUserType(type) {
if (type === 'A') {
return '前端';
} else if (type === 'B') {
return '后端';
} else if (type === 'C') {
return '全干';
} else {
return '未知';
}
}

优化后:

const userMap = {
A: '前端',
B: '后端',
C: '全干',
D: '未知',
}; function getUserType(type) {
return userMap[type] ?? userMap.default;
}

使用面向对象设计中的多态

将不同条件分支封装到不同类中,善用对象的多态概念,可以优化一部分代码。

说实话,JS 的代码还是不太习惯面向对象风格,还是习惯函数式编程,但这种优化方式还是值得学习的。

优化前的代码:

// 重构前(if-else 判断角色权限)
function checkPermission(user) {
if (user.role === 'admin') {
return true; // 管理员有用所有操作权限
} else if (user.role === 'editor') {
return action === 'edit'; // 网站编辑只有编辑权限
} else {
return action === 'view'; // 访客只有查看权限
}
}

优化后:

// 重构后(多态实现)
class Admin { // 管理员有用所有操作权限
can(action) { return true; }
} class Editor { // 网站编辑只有编辑权限
can(action) { return action === 'edit'; }
} class Guest { // 访客只有查看权限
can(action) { return action === 'view'; }
} function checkPermission(user, action) {
return user.can(action);
}

使用链式判断

利用 ES6 现代语法简化嵌套属性访问和条件判断,ES6 的可选链操作符是真的可以省下很多代码量,再组合使用空值合并,代码逼格瞬间提升。

优化前的代码:

function getUserCity(user) {
if (user && user.address && user.address.location) {
return user.address.location.city;
}
return '未知';
}

优化后:

// 链式判断 + 空值合并
function getUserCity(user) {
return user?.address?.location?.city ?? '未知';
}

善用单一职责

将复杂条件拆分为多个独立函数,每个函数只做一件事,代码不要写得太复杂,谁都能看懂的代码才是好代码!

优化前的代码:

// 不同的用户价格计算逻辑
function calcPrice(user, product) {
if (user.isVIP) {
if (product.stock > 0) {
return product.price * 0.8; // VIP 用户打8折
} else {
throw new Error('缺货');
}
} else {
if (product.stock > 0) {
return product.price; // 非 VIP 用户原价
} else {
throw new Error('缺货');
}
}
}

优化后:

function isProductAvailable(product) { // 判断产品是否有库存
if (product.stock <= 0) throw new Error('缺货');
} function getVIPDiscount(user) {
return user.isVIP ? 0.8 : 1; // 判断用户是否打折
} function calcPrice(user, product) {
isProductAvailable(product); // 先判断产品库存
return product.price * getVIPDiscount(user); // 计算价格
}

写在最后

代码谁都能写,但写出来的代码好不好看,能不能维护,这就是考验技术的时候了。

总结几个编码原则,仅供参考:

1、单一职责:每个函数/模块只处理一个逻辑。

2、早返早拒:优先处理无效条件,减少嵌套。

3、数据结构化:用对象、Map 或类替代硬编码条件。

4、现代语法:善用 ?.、??、||、&& 等简化代码。

Web前端入门第 59 问:JavaScript 条件语句中善用 return 让代码更清晰的更多相关文章

  1. web前端入坑第五篇:秒懂Vuejs、Angular、React原理和前端发展历史

    秒懂Vuejs.Angular.React原理和前端发展历史 2017-04-07 小北哥哥 前端你别闹 今天来说说 "前端发展历史和框架" 「前端程序发展的历史」 「 不学自知, ...

  2. Android零基础入门第59节:AnalogClock、DigitalClock和TextClock时钟组件

    原文:Android零基础入门第59节:AnalogClock.DigitalClock和TextClock时钟组件 在前面一期,我们学习了DatePicker和TimePicker,在实际开发中其不 ...

  3. JavaScript条件语句4--分支语句--if

    JavaScript条件语句--分支语句 学习目标 1.掌握条件语句if 2.掌握prompt()的应用 3.掌握alert的应用 If语句 语法一: If(condition){ statement ...

  4. JavaScript条件语句-5--if语句的嵌套

    JavaScript条件语句 学习目标 1.掌握length属性的应用 2.掌握if语句的嵌套 length 语法:string.length 功能:获取string字符串的长度 返回值:number ...

  5. C语言条件语句中调用函数并赋值时的一个小坑

    在C语言中,如果在条件语句中赋值,一定要注意符号优先级的问题,比较符号是比赋值符号先执行的.如果同时还调用函数,并将返回值赋给变量,更容易产生错误. 看下面的代码: int increase(int ...

  6. web前端入坑第二篇:web前端到底怎么学?干货资料! 【转】

    http://blog.csdn.net/xllily_11/article/details/52145172 版权声明:本文为博主[小北]原创文章,如要转载请评论回复.个人前端公众号:前端你别闹,J ...

  7. web前端(13)—— 了解JavaScript,JavaScript的引入方式

    从本篇博文开始,将进入web前端方便最关键最重要的部分——javascript,学到后面你就知道它真的太重要了 什么是JavaScript JavaScript一种直译式的脚本语言,是一种动态类型.弱 ...

  8. WEB前端工程师整理的原生JavaScript经典百例

    一.原生JavaScript实现字符串长度截取 二.原生JavaScript获取域名主机 三.原生JavaScript转义html标签 四.原生JavaScript时间日期格式替换 Date.prot ...

  9. Web前端基础怎么学? JavaScript、html、css知识架构图

    以前开发者只要掌握 HTML.CSS.JavaScript 三驾马车就能胜任一份前端的工作了.而现在除了普通的编码以外,还要考虑如何性能优化,如何跨端.跨平台实现功能,尤其是 AI.5G 技术的来临, ...

  10. web前端学习之HTML CSS/javascript之一

    前端编码之路之坎坷,web前端应该一直是个战场吧,各种浏览器的不兼容,各种小细节的修改,要往一个好的产品经理方向走,实在是难,昨天听了一位十年经验的产品经理讲座,最重要的恐怕就是协调资源的能力,而协调 ...

随机推荐

  1. 补充:基于项目的协同过滤推荐算法(Item-Based Collaborative Filtering Recommendation Algorithms)

    前言 继续上篇博客,继续读论文. 想看上篇论文的同学可以点击这里 相关工作 In this section we briefly present some of the research litera ...

  2. VMware15.5虚拟机下载及安装

    一.VMware虚拟机介绍 VMWare虚拟机软件是一个"虚拟PC"软件,它使你可以在一台机器上同时运行二个或更多Windows.DOS.LINUX系统.与"多启动&qu ...

  3. Tauri新手向 - 基于LSB隐写的shellcode加载器

    此篇是记录自己初次学习tauri开发工具,包含遇到的一些问题以及基本的知识,也给想上手rust tauri的师傅们一些小小的参考.此项目为保持免杀性暂不开源,希望各位师傅多多支持,反响可以的话后续会放 ...

  4. Linux下使用sz/rz命令从服务器下载或上传文件

    简介 Linux中rz命令和sz命令都可用于文件传输,而rz命令主要用于文件的上传,sz命令用于从Linux服务器下载文件到本地. 安装 yum安装 yum -y install lrzsz 源码安装 ...

  5. 『Plotly实战指南』--折线图绘制进阶篇

    上一篇介绍了Plotly绘制折线图的基础知识和数据预处理的技巧, 本文将重点探讨如何利用Plotly实现多线折线图的布局设计以及动态折线图的实现, 让我们一起掌握进阶的折线图绘制技巧. 1. 多折线图 ...

  6. 本地项目上传到gitee

    前置条件:本地已经装好了GIt和GITEE有远程地址 检查本地装好了GIT:鼠标右键 检查准备好了远程:地址 本地项目拷贝到目录 D:\tmp2024-02-19\code 本地项目所在文件夹打开gi ...

  7. 一款 .NET 开源、功能强大的远程连接管理工具,支持 RDP、VNC、SSH 等多种主流协议!

    前言 今天大姚给大家分享一款基于 .NET 开源(GPL-2.0 license).免费.功能强大的 Windows 远程连接管理工具,支持 RDP.VNC.SSH 等多种主流协议:mRemoteNG ...

  8. 实现领域驱动设计 - 使用ABP框架 - 领域逻辑 & 应用逻辑

    领域逻辑 & 应用逻辑 如前所述,领域驱动设计中的业务逻辑分为两部分(层):领域逻辑和应用逻辑: 领域逻辑由系统的核心领域规则组成,应用逻辑实现应用特定的用例 虽然定义很明确,但实现起来可能并 ...

  9. Redis 相关

    高并发多机的时候,虽然有失效时间,但还是会有短时间内缓存和数据库数据不一致(读操作不需要特殊操作),更新操作的时候先删除缓存,再更新数据库先更新数据库,再删除缓存原子性破坏,增加队列重试 先删除缓存, ...

  10. leetcode每日一题:最大或值

    题目 2680. 最大或值 给你一个下标从 0 开始长度为 n 的整数数组 nums 和一个整数 k .每一次操作中,你可以选择一个数并将它乘 2 . 你最多可以进行 k 次操作,请你返回 nums[ ...