百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

「JS优化篇」你的 if - else 代码肯定没我写的好

itomcoil 2025-03-07 19:55 10 浏览


作者:小生方勤

转发链接:
https://mp.weixin.qq.com/s/JzOQ_OwAYoP5Ic1VBtCZNA

前言

最近部门在对以往的代码做一些优化,我在代码中看到一连串的 if(){}elseif(){} 的逻辑判断。这明显是有优化空间的。

由于内部代码不适合分享,这里我就用 <输出今天为星期几> 来讲讲逻辑判断优化的一些方案。

这里先声明,免有人疑惑:

我们在项目中使用的很可能会有多层的嵌套,不像我的例子只有一层。不过其优化的思想是大致相同的。由于 returnWeekday() 方法异常之简单,所以提前声明。

需求

写一个 returnWeekday() 方法返回"今天是星期*"。

接下来我们就一步一步来。

优化过程

这里我简单的分为 “初学 —> 入门 —> 中级” 这几个阶段。

初学

当我们开始拿到需求的时候,看到一系列的逻辑判断,首先想到的应该就是 if语句了。

代码如下:

function returnWeekday(){    
  let string = "今天是星期";   
  let date = new Date().getDay();    
  if (date === 0) {        
    string += "日";    
  } else if (date === 1) {      
    string += "一";   
  } else if (date === 2) {       
    string += "二";    
  } else if (date === 3) {        
    string += "三";   
  } else if (date === 4) {       
    string += "四";   
  } else if (date === 5) {       
    string += "五";    
  } else if (date === 6) {       
    string += "六";   
  }    
  return string
}
console.log(returnWeekday())

当我们写完了这样的代码,第一感觉就是 elseif 块是不是太多了。

可是当我们还在思考如何优化的时候,产品就在钉钉发消息给你问这个需求完成的怎么样了?还带了一个坏笑的表情包。这个时候你告诉自己,这个优化后面再说吧。可是久而久之,需求加之。这个再也没有优化过了,直到下一个接手。

上面的代码确实 elseif 块太多了,看着就不舒服。

我们在看《JavaScript 高级程序设计》的时候,看到这样一句话:

switch 语句与 if 语句的关系最为密切,而且也是在其他语言中普遍使用的一种流控制语句。

所以我们是不是可以考虑使用 switch 语句来优化一下呢?

入门

这里我们使用 switch 语句优化一遍代码。

注意:switch 语句在比较值的时候使用的是全等操作符,不会有类型转换的情况。

代码如下:

function returnWeekday(){    
  let string = "今天是星期";    
  let date = new Date().getDay();   
  switch (date) {        
    case 0 :            
      string += "日";           
      break;       
    case 1 :          
      string += "一";           
      break;        
    case 2 :            
      string += "二";           
      break;        
    case 3 :           
      string += "三";          
      break;        
    case 4 :            
      string += "四";           
      break;        
    case 5 :            
      string += "五";           
      break;        
    case 6 :            
      string += "六";           
      break;    
  }    
  return string}console.log(returnWeekday())

我们在 case 里面拼接字符,以达到输出预期结果的目的。这里的结构看起来确实比 if 语句清晰了一点。可是还是有点疑惑?

假设哪一天,相关组织发现,形象有变。每周需要变成八天(产品的思维,你无法想象)。我们这个 returnWeekday() 方法就需要多加一层判断了。

我们的希望是已经封装好的方法,不要频繁的修改。可是需求的变动是你无法控制的。

所以我们继续思考该怎么优化。

中级

我们看到这里的 case 是数字,和数组的下标是一致的。

即:[天,一,二,三,四,五,六] 的下标。

所以我们可以考虑使用数组来优化。

代码如下:

function returnWeekday(){    
  let string = "今天是星期";    
  let date = new Date().getDay();    
  // 使用数组   
  let dateArr = [ 天 , 一 , 二 , 三 , 四 , 五 , 六 ];   
  return string + dateArr[date]
}
console.log(returnWeekday())

以上代码是不是比 switch 语句和 if 语句清晰多了。而且就算一周变为八天,只需要修改 dateArr 数组就好了。

倘若我们的每个 case 是否规律的字符串呢?那我们使用对象,每个 case 为一个 key

代码如下:

function returnWeekday(){    
  let string = "今天是星期";    
  let date = new Date().getDay();    
  // 使用对象    
  dateObj = {         
    0:  天 ,         
    1: "一",        
    2: "二",        
    3: "三",         
    4: "四",         
    5: "五",         
    6: "六",    
  };   
  return string + dateObj[date]
}
console.log(returnWeekday())

以上使用数组或者对象的写法,提高代码的可读性的同时,维护起来也变得简单了。

使用 charAt 字符方法

字符串有个和使用数组下标类似的方法:

// charAt 定位方法
function returnWeekday(){    
  return "今天是星期" + "日一二三四五六".charAt(new Date().getDay());
}
console.log(returnWeekday())

需求变动

这个时候,有人希望 returnWeekday() 方法不仅返回今天是周几,还需要区分工作日和休息日,调用相关方法。

如果是使用 switch、 if 或 数组 维护起来就有点麻烦,需要改写的地方还挺多的。

function returnWeekday(){    
  let string = "今天是星期";    
  let date = new Date().getDay();   
  // 使用对象    
  dateObj = {         
    0: ['天','休'],         
    1: ["一",'工'],         
    2: ["二",'工'],        
    3: ["三",'工'],         
    4: ["四",'工'],         
    5: ["五",'工'],         
    6: ["六",'休'],     
  }   
  // 类型,这里也可以对应相关方法    
  dayType = {       
    '休':  function(){           
      // some code            
      console.log('为休息日')       
    },        
    '工': function(){           
      // some code           
      console.log('为工作日')       
    }   
  }   
  let returnData = {         
    string  : string + dateObj[date][0],         
    method  : dayType[dateObj[date][1]]    
  }   
  return returnData};
console.log(returnWeekday().method.call(this))

其他常见优化手段

这里在给出一些常见的优化手段。

三元运算

适合简单的 if(){}else{} 情况。

//滚动监听,头部固定
handleScroll: function () {    
  et offsetTop = this.$refs.pride_tab_fixed.getBoundingClientRect().top;   
  if( offsetTop < 0 ){        
    this.titleFixed = true   
  } else {       
    this.titleFixed = false  
  }    
  // 改成三元    
  (offsetTop < 0) ? this.titleFixed = true : this.titleFixed = false;    
  // 我们发现条件块里面的赋值情况是布尔值,所以可以更简单    
  this.titleFixed = offsetTop < 0;
}

这样在精简代码的时候,可读性也没有降低。

逻辑与运算符

有些时候我们可以使用逻辑与运算符来简化代码

if( falg ){    
  someMethod()
}

可以改成:

falg && someMethod();

使用 includes 处理多重条件

if( code ===  202  || code ===  203  || code ===  204  ){    someMethod()}

可以改成

if( [ 202 , 203 , 204 ].includes(code) ){   
  someMethod()
}

推荐JavaScript经典实例学习资料文章

前端上传前预览文件 image、text、json、video、audio「实践」

推荐13个有用的JavaScript数组技巧「值得收藏」

前端必备基础知识:window.location 详解

不要再依赖CommonJS了

犀牛书作者:最该忘记的JavaScript特性

36个工作中常用的JavaScript函数片段「值得收藏」

Node + H5 实现大文件分片上传、断点续传

一文了解文件上传全过程(1.8w字深度解析)「前端进阶必备」

【实践总结】关于小程序挣脱枷锁实现批量上传

手把手教你前端的各种文件上传攻略和大文件断点续传

字节跳动面试官:请你实现一个大文件上传和断点续传

谈谈前端关于文件上传下载那些事【实践】

手把手教你如何编写一个前端图片压缩、方向纠正、预览、上传插件

最全的 JavaScript 模块化方案和工具

「前端进阶」JS中的内存管理

JavaScript正则深入以及10个非常有意思的正则实战

前端面试者经常忽视的一道JavaScript 面试题

一行JS代码实现一个简单的模板字符串替换「实践」

JS代码是如何被压缩的「前端高级进阶」

前端开发规范:命名规范、html规范、css规范、js规范

【规范篇】前端团队代码规范最佳实践

100个原生JavaScript代码片段知识点详细汇总【实践】

关于前端174道 JavaScript知识点汇总(一)

关于前端174道 JavaScript知识点汇总(二)

关于前端174道 JavaScript知识点汇总(三)

几个非常有意思的javascript知识点总结【实践】

都2020年了,你还不会JavaScript 装饰器?

JavaScript实现图片合成下载

70个JavaScript知识点详细总结(上)【实践】

70个JavaScript知识点详细总结(下)【实践】

开源了一个 JavaScript 版敏感词过滤库

送你 43 道 JavaScript 面试题

3个很棒的小众JavaScript库,你值得拥有

手把手教你深入巩固JavaScript知识体系【思维导图】

推荐7个很棒的JavaScript产品步骤引导库

Echa哥教你彻底弄懂 JavaScript 执行机制

一个合格的中级前端工程师需要掌握的 28 个 JavaScript 技巧

深入解析高频项目中运用到的知识点汇总【JS篇】

JavaScript 工具函数大全【新】

从JavaScript中看设计模式(总结)

身份证号码的正则表达式及验证详解(JavaScript,Regex)

浏览器中实现JavaScript计时器的4种创新方式

Three.js 动效方案

手把手教你常用的59个JS类方法

127个常用的JS代码片段,每段代码花30秒就能看懂-【上】

深入浅出讲解 js 深拷贝 vs 浅拷贝

手把手教你JS开发H5游戏【消灭星星】

深入浅出讲解JS中this/apply/call/bind巧妙用法【实践】

手把手教你全方位解读JS中this真正含义【实践】

书到用时方恨少,一大波JS开发工具函数来了

干货满满!如何优雅简洁地实现时钟翻牌器(支持JS/Vue/React)

手把手教你JS 异步编程六种方案【实践】

让你减少加班的15条高效JS技巧知识点汇总【实践】

手把手教你JS开发H5游戏【黄金矿工】

手把手教你JS实现监控浏览器上下左右滚动

JS 经典实例知识点整理汇总【实践】

2.6万字JS干货分享,带你领略前端魅力【基础篇】

2.6万字JS干货分享,带你领略前端魅力【实践篇】

简单几步让你的 JS 写得更漂亮

恭喜你获得治疗JS this的详细药方

谈谈前端关于文件上传下载那些事【实践】

面试中教你绕过关于 JavaScript 作用域的 5 个坑

Jquery插件(常用的插件库)

【JS】如何防止重复发送ajax请求

JavaScript+Canvas实现自定义画板

Continuation 在 JS 中的应用「前端篇」

作者:小生方勤

转发链接:
https://mp.weixin.qq.com/s/JzOQ_OwAYoP5Ic1VBtCZNA

相关推荐

Python自动化——pytest常用插件详解

前言Pytest是Python的一种单元测试框架,与unittest相比,使用起来更简洁、效率更高,也是目前大部分使用python编写测试用例的小伙伴们的第一选择了。除了框架本身提供的功能外,Pyte...

全网最全pytest大型攻略,单元测试学这就够了

pytest是一款以python为开发语言的第三方测试,主要特点如下:比自带的unittest更简洁高效,兼容unittest框架支持参数化可以更精确的控制要测试的测试用例丰富的插件,已有30...

Python Logging 最佳实践(python logging配置)

Pythonlogging的“最佳实践”可以概括为一句话:让日志既能在开发时帮你排错,也能在生产里帮你定位问题,同时不给运维埋坑。下面给出一份可直接落地的checklist,分场景逐条说明。1....

Python单元测试框架对比(python中unittest框架)

一、核心框架对比特性unittest(标准库)pytest(主流第三方)nose2(unittest扩展)doctest(文档测试)安装Python标准库pipinstallpytestp...

如何使用Python进行单元测试(pycharm单元测试)

前言在我的日常工作中,我是一名专业程序员。我使用c++、c#和Javascript。我是一个开发团队的一员,他们使用单元测试来验证我们的代码是否按照它应该的方式工作。在本文中,我将通过讨论以下主题来研...

Python单元测试(pycharm单元测试)

1.单元测试概述1.1什么是单元测试单元测试(UnitTesting)是指对软件中的最小可测试单元进行检查和验证的过程。在Python中,最小单元通常指函数、方法或类。1.2单元测试的特性独立...

pytest框架之fixture测试夹具详解

前言大家晚上好呀,今天呢来和大家唠唠pytest中的fixtures夹具的详解,废话就不多说了咱们直接进入主题哈。一、fixture的优势pytest框架的fixture测试夹具就相当于unitte...

Pytest精髓Fixture功能实例!测试效率暴涨!

前言大家好!我们今天来学习Python测试框架中的最具特色的功能之一:Fixture。可以说,掌握了Fixture,你就掌握了Pytest的精髓。它不仅能让你的测试代码更简洁、更优雅、更易于...

Python最常见的170道面试题全解析答案(二)

60.请写一个Python逻辑,计算一个文件中的大写字母数量答:withopen(‘A.txt’)asfs:count=0foriinfs.read():ifi.isupper...

为什么python高手都爱用闭包?这个实时函数技巧绝了

杂谈我想很多人都玩过python的闭包,其中最有趣的部分应该就是装饰器了。但我想很多人应该没运用上闭包的特性——外部局部变量的存储。什么意思呢?其实就是当闭包引用外部的局部变量将会被存储起来,而不会随...

春节停车难?用Python找空车位(用python编写停车场停车收费)

【导语】今天这篇文章的选题非常贴近生活。营长生活在北京,深知开车出门最怕的就是堵车和找不到停车位。记得冬至那个周末,几个小伙伴滑雪回来找了一家饺子馆吃饺子,结果七拐八拐,好不容易才找到一个停车位。看到...

PYTHON数据分析必备知识(2)(python数据分析范例)

1.二分钟快速给项目添加日志信息"""给项目添加日志信息"""#导Python内置包importloggingimporttime...

春节回家!车位难求啊!看我用Python自动寻找空车位!

作者通过相机结合深度学习算法,基于Python语言建立一个高精度的停车位的通知系统,每当有新停车位时就会发短信提醒我。听起来好像很复杂,真的方便实用吗?但实际上所使用的工具都是现成的,只要将这些工...

“==”和“is”有什么区别?一个问题就能暴露你的Python水平

可能在网上你经常能看到关于这个问题的答案和解析,但是依然有很多刚开始学习Python的人,不了解这个问题,也不知道为什么问这个问题时会暴露自己是“菜鸟”,这个问题就是:“==”和“is”之间有什么...

Python条件语句怎么用(python中条件语句的用法)

if条件判断语句python语句是按固定顺序执行的,先执行前面的语句,再执行后面的语句。如果你像要程序按照你自己定制的流程执行,就需要用到流程控制的语句,最主要用到的是条件语句和循环语句。条件语句...