【JS代码优化一】分支优化篇

简介: 【JS代码优化一】分支优化篇

序:如何让代码看起来更优雅?代码是由文字堆叠起来的可以被机器执行的程序。它记载着相关信息(状态)、表达相关的情绪(函数),所以如何能够写出简洁、优雅、健壮、可维护性强的程序至关重要。本系列笔记的目的,就是带着大家如何实现更有效、更优雅的编程。笔记涵盖:运算符、流程语句、设计模式、ES6 新增方法等多个方面。

数字化管理平台

Vue3+Vite+VueRouter+Pinia+Axios+ElementPlus教程

权限系统-商城

个人博客地址

1. 逻辑或运算符 ||

逻辑或运算符,也叫短路运算符。当 || 运算符左边的值为 true 时,则返回左边表达式的值,反之则返回右边表达式的值。如下:

true || false   // true
false || true   // true
10 > 20 || "Hello"  // "Hello"
"" || 0   // 0
undefined || null   // null

上面代码是逻辑或最常用的场景,其实基于上面的场景,可以来优化大家经常写的 if…else 代码,如下:

let result
if (a) {
  result = a
} else {
  result = b
}

很简单的一段代码,但是使用短路运算符要简洁的多,如下:

let result = a || b

2. 三元运算符 ? :

提到 if…else 优化,就不得不说一下三元运算符了。这个运算符在替换条件语句的时候也是很好用的。但是注意不要嵌套太多层哦!毕竟嵌套多了,可读性就不强了,也就背离了我们代码优化的目的。

语法格式:

条件表达式 ? 条件表达式成立的值 : 条件表达式不成立的值

这样上面的 if 语句,使用三元运算符表示如下:

let result = a ? a : b

当然,写到这里,见多识广的你可能会想到上面的语句还能再一步优化,这里先卖个关子,大家可以在后面的案例中查找彩蛋。

三元表达式在诸如:条件判断、条件赋值、递归等场景应用也是比较多的。如下,实现一个累加函数:

使用条件语句实现

let sum = 0;
function increment (n) {
  sum += n
  if (n === 1) 
    return sum
  else 
    return increment(n - 1)
}

使用三元运算符实现

let sum = 0;
function increment (n) {
  sum += n
  return n >= 2 ? increment(n - 1) : sum
}

3. 对象/数组配置

对于条件复杂的多重判断,三元运算符可读性不强,条件语句和选择语句可以实现,但是写起来很麻烦,代码变得很臃肿。如下:

条件语句实现:

let dayNum = 1
let getWeekDay = (dayNum) => {
  if (dayNum === 7) {
      return "星期日"
  } else if (dayNum === 1) {
      return "星期一"
  } else if (dayNum === 2) {
      return "星期二"
  } else if (dayNum === 3) {
      return "星期三"
  } else if (dayNum === 4) {
      return "星期四"
  } else if (dayNum === 5) {
      return "星期五"
  } else if (dayNum === 6) {
      return "星期六"
  } else {
      return "不是合法的值"
  }
}

选择语句实现:

let result;
switch (dayNum) {
    case 0: 
        result = "星期日"
        break
    case 1: 
        result = "星期一"
        break
    case 2: 
        result = "星期二"
        break
    case 3: 
        result = "星期三"
        break
    case 4: 
        result = "星期四"
        break
    case 5: 
        result = "星期五"
        break
    case 6: 
        result = "星期六"
        break
    default:
        result = "不是合法的值"
        break
}
return result;

看到这里,你应该已经不想看了,不禁吐槽:这也太麻烦了吧!是的,所以我们想办法优化他吧,比方把相关的数据封装到数组或者对象中,然后取对应的值呢?

数组方式实现:

let days = ["星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期日"]
let result = days[dayNum] ?? "不是合法的值"

对象方式实现:

let days = {
    0: "星期日",
    1: "星期一",
    2: "星期二",
    3: "星期三",
    4: "星期四",
    5: "星期五",
    6: "星期六",
}
let result = days[dayNum] ?? "不是合法的值"

这样的代码,在你看来是不是有一种“神清气爽”的感觉。ES6 中新增 Map 对象,我们同样可以使用 Map 来实现上面的功能,原理都是一样的。

let days = new Map([
    [0, "星期日"],
    [1, "星期一"],
    [2, "星期二"],
    [3, "星期三"],
    [4, "星期四"],
    [5, "星期五"],
    [6, "星期六"]
])
let result = days.get(dayNum) || "不是合法的值"

4. 复杂条件分支优化

上面所列举的都是一些比较简单直接的判断条件,如果判断条件过于复杂,那么我们应该如何去处理呢?先看下面这段改造代码:

let days = {
   0: () => "星期日",
   1: () => "星期一",
   2: () => "星期二",
   3: () => "星期三",
   4: () => "星期四",
   5: () => "星期五",
   6: () => "星期六",
}
let result = days[dayNum] ? days[dayNum]() : "不是合法的值"

看过上面的代码,你可能会说这不还是 key-value 形式吗,无非就是多了一步,需要执行函数才能获得对应的值。没错,但是这样的好处是,你可以在对应的函数中执行任何你想实现的逻辑,相对更加灵活一些。

那么,回过头了,我们继续说复杂条件分支的优化问题,如下:

let score = 98;
let getResult = (score) => {
    if (score <= 100 && score >= 90) {
        return "优秀"
    } else if (score < 90 && score >= 80) {
        return "良好"
    } else if (score < 80 && score >= 70) {
        return "中等"
    } else if (score < 70 && score >= 60) {
        return "及格"
    } else if (score < 60 && score >= 0) {
        return "不及格"
    } else {
        return "非法字符"
    }
}

很明显,上面判断的条件表达式不再是简单的等值判断了,像这种情况,我们依旧可以按照上面的思想进行优化改造。可以考虑使用二维数组实现。

二维数组方式:

let scores = [
    [(score) => score <= 100 && score >= 90, () => "优秀"],
    [(score) => score <= 90 && score >= 80, () => "良好"],
    [(score) => score <= 80 && score >= 70, () => "中等"],
    [(score) => score <= 70 && score >= 60, () => "及格"],
    [(score) => score <= 60 && score >= 0, () => "不及格"]
]
let getResult = (score) => {
    // 判断符合条件的子数组
    let obj = scores.find(v => v[0](score))
    // 子数组存在,则运行数组中第二个函数元素,否则返回其它信息
    let result = obj ? obj[1]() : "非法字符"
    return result;
}

这里注重的是最终得到的结果,而不是获得结果的过程。当今硬件性能过剩下情况下,我们通过这种更加优雅、简洁、可维护性的方式来获取最终想要的结果,显然是更可取的。

你要记住:优雅永不过时,浪漫至死不渝。

好了,到这里《JS代码优化一》分享就已经结束了,如果感觉还不错记得点赞收藏。你还知道哪些代码优化的方案呢?那就写出来把。


相关文章
|
5月前
|
监控 负载均衡 JavaScript
有哪些有效的方法可以优化Node.js应用的性能?
有哪些有效的方法可以优化Node.js应用的性能?
311 69
|
5月前
|
监控 算法 JavaScript
公司局域网管理视域下 Node.js 图算法的深度应用研究:拓扑结构建模与流量优化策略探析
本文探讨了图论算法在公司局域网管理中的应用,针对设备互联复杂、流量调度低效及安全监控困难等问题,提出基于图论的解决方案。通过节点与边建模局域网拓扑结构,利用DFS/BFS实现设备快速发现,Dijkstra算法优化流量路径,社区检测算法识别安全风险。结合WorkWin软件实例,展示了算法在设备管理、流量调度与安全监控中的价值,为智能化局域网管理提供了理论与实践指导。
147 3
|
4月前
|
JavaScript
JS代码的一些常用优化写法
JS代码的一些常用优化写法
79 0
|
8月前
|
前端开发 JavaScript Java
JavaScript闭包深入剖析:性能剖析与优化技巧
JavaScript 闭包是强大而灵活的特性,广泛应用于数据封装、函数柯里化和事件处理等场景。闭包通过保存外部作用域的变量,实现了私有变量和方法的创建,提升了代码的安全性和可维护性。然而,闭包也可能带来性能问题,如内存泄漏和执行效率下降。为优化闭包性能,建议采取以下策略:及时解除对不再使用的闭包变量的引用,减少闭包的创建次数,使用 WeakMap 管理弱引用,以及优化闭包结构以减少作用域链查找的开销。在实际开发中,无论是 Web 前端还是 Node.js 后端,这些优化措施都能显著提升程序的性能和稳定性。
213 70
|
5月前
|
人工智能 监控 前端开发
基于 Next.js 的书法字体生成工具架构设计与 SSR 优化实践
本项目是一款书法字体生成工具,采用 Next.js 14(App Router)与 Tailwind CSS 构建前端,阿里云 Serverless 部署后端。通过混合渲染策略(SSG/SSR/CSR)、Web Worker 异步计算及 CDN 字体分片加载优化性能。服务端借助阿里云函数计算处理计算密集型任务,将平均耗时从 1200ms 降至 280ms,支持 1000+ QPS。动态路由与 ARMS 监控提升工程化水平,未来计划引入 WebGPU 和 AI 字体风格迁移技术,进一步优化用户体验。
|
7月前
|
前端开发 JavaScript
【Javascript系列】Terser除了压缩代码之外,还有优化代码的功能
Terser 是一款广泛应用于前端开发的 JavaScript 解析器和压缩工具,常被视为 Uglify-es 的替代品。它不仅能高效压缩代码体积,还能优化代码逻辑,提升可靠性。例如,在调试中发现,Terser 压缩后的代码对删除功能确认框逻辑进行了优化。常用参数包括 `compress`(启用压缩)、`mangle`(变量名混淆)和 `output`(输出配置)。更多高级用法可参考官方文档。
525 11
|
7月前
|
JavaScript 前端开发 算法
JavaScript 中通过Array.sort() 实现多字段排序、排序稳定性、随机排序洗牌算法、优化排序性能,JS中排序算法的使用详解(附实际应用代码)
Array.sort() 是一个功能强大的方法,通过自定义的比较函数,可以处理各种复杂的排序逻辑。无论是简单的数字排序,还是多字段、嵌套对象、分组排序等高级应用,Array.sort() 都能胜任。同时,通过性能优化技巧(如映射排序)和结合其他数组方法(如 reduce),Array.sort() 可以用来实现高效的数据处理逻辑。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
9月前
|
前端开发 JavaScript
【02】v1.0.1更新增加倒计时完成后的放烟花页面-优化播放器-优化结构目录-蛇年新年快乐倒计时领取礼物放烟花html代码优雅草科技央千澈写采用html5+div+CSS+JavaScript-优雅草卓伊凡-做一条关于新年的代码分享给你们-为了C站的分拼一下子
【02】v1.0.1更新增加倒计时完成后的放烟花页面-优化播放器-优化结构目录-蛇年新年快乐倒计时领取礼物放烟花html代码优雅草科技央千澈写采用html5+div+CSS+JavaScript-优雅草卓伊凡-做一条关于新年的代码分享给你们-为了C站的分拼一下子
231 14
【02】v1.0.1更新增加倒计时完成后的放烟花页面-优化播放器-优化结构目录-蛇年新年快乐倒计时领取礼物放烟花html代码优雅草科技央千澈写采用html5+div+CSS+JavaScript-优雅草卓伊凡-做一条关于新年的代码分享给你们-为了C站的分拼一下子
|
11月前
|
存储 缓存 JavaScript
如何优化Node.js应用的内存使用以提高性能?
通过以上多种方法的综合运用,可以有效地优化 Node.js 应用的内存使用,提高性能,提升用户体验。同时,不断关注内存管理的最新技术和最佳实践,持续改进应用的性能表现。
529 62
|
7月前
|
JavaScript 前端开发 Java
详解js柯里化原理及用法,探究柯里化在Redux Selector 的场景模拟、构建复杂的数据流管道、优化深度嵌套函数中的精妙应用
柯里化是一种强大的函数式编程技术,它通过将函数分解为单参数形式,实现了灵活性与可复用性的统一。无论是参数复用、延迟执行,还是函数组合,柯里化都为现代编程提供了极大的便利。 从 Redux 的选择器优化到复杂的数据流处理,再到深度嵌套的函数优化,柯里化在实际开发中展现出了非凡的价值。如果你希望编写更简洁、更优雅的代码,柯里化无疑是一个值得深入学习和实践的工具。从简单的实现到复杂的应用,希望这篇博客能为你揭开柯里化的奥秘,助力你的开发之旅! 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一