声明式和函数式 JavaScript 原则

命令式与声明式代码

这是两种不同的编写代码的方式,我们也称之为范式;

命令式

  • 程序员需要解释"如何去一步步的做事";
  • 我们向计算机解释它为了达到某一种结果所必须遵循的每一个;
  • 例如:需要制作一个蛋糕,我会向食谱一样,需要把每一步都告诉计算机,这样它才能得到一个蛋糕;
js 复制代码
const arr = [2, 4, 6, 8];
const doubled = [];
for (let i = 1; i < arr.length; i++) {
  doubled[i] = arr[i] * 2;
}

声明式

  • 程序员只需要告诉计算机"做什么东西";
  • 我们只是简单的描述了计算应该如何去实现结果;
  • 具体实现的步骤说明被抽象了;
  • 例如:需要制作一个蛋糕,我只需要告诉计算机我想要一个什么样的蛋糕,具体你去怎么做出来这个蛋糕,我并不关心;
js 复制代码
const arr = [2, 4, 6, 8];
const doubled = arr.map(n => n * 2);

函数式

  • 它也属于是声明式函数范式;
  • 声明式编程的核心思想是通过组合许多纯函数来编写软件,从而避免副作用和数据的变更。再这种编程范式中,程序员专注于描述"做什么",而不是"如何做";
  • 副作用:在函数执行过程中对函数外部任何数据的修改(例如,修改外部变量,在控制台记录信息,对文档对象模型写入等)。副作用可能导致程序行为的不确定性,使得代码更难以理解和维护。
  • 纯函数: 是指不产生副作用的函数。这类函数不依赖外部变量,给定相同的输入,始终返回相同的输出。纯函数的特性使得它们更易于测试和重用;
  • 不可变性:在这种编程范式中,状态(数据)永远不会被直接修改!相反,状态会被复制,并对副本进行变更后的返回。这种不可变性有助于避免意外的状态改变,提高程序的可靠性和可预测性;

react和vue两者对声明式和函数式编程方面都提供了不通的实现方式。React更加倾向于通过纯函数和Hooks来实现无副作用的组件设计,而VUE则通过响应式数据绑定和模板语法来简化UI更新和状态管理;

函数式编程技巧

  • 尽量避免数据的修改:在函数式编程中,保持数据的不可变性是非常重要的。通过创建新的数据结构而不是直接修改现有数据,可以减少副作用,提高代码的可维护性和可预测性。
  • 使用不产生副作用的内置方法:选择那些不会改变原始数据的内置数组和对象方法,例如map()filter()reduce()。这样的方法可以帮助你保持函数的纯粹性,使得每个函数的输出只依赖于其输入,而不依赖于外部状态。
  • 进行数据转换:可以使用map()filter()reduce()等方法来进行数据转换和聚合操作,充分利用这些高阶函数来简化代码逻辑,使代码更简洁且易于理解。
  • 尽量避免函数中的副作用:尽管在某些情况下避免副作用可能不是总能做到的,但应尽量使函数保持纯粹,只依赖其输入参数来生成输出,避免对外部状态的影响。

声明式语法

  • 使用数据和对象解构:通过解构赋值,可以方便地提取数组或对象中的值,使代码更加简洁且易于阅读。
  • 使用扩展运算符(...):展运算符可以用来快速复制数组或对象,或者将多个数组合并为一个。这种语法使得数据操作更加直观,减少了冗余代码。
  • 使用三元运算符(条件运算符):三元运算符可以方便地进行条件判断,从而使得代码在处理简单条件时更加简洁,避免多行的if-else语句。
  • 使用模板字面量:模板字面量提供了一种更灵活的字符串拼接方式,可以在字符串中直接嵌入变量,简化了字符串的构建过程,使代码更加清晰易读。
相关推荐
烛阴4 分钟前
UV Coordinates & Uniforms -- OpenGL UV坐标和Uniform变量
前端·webgl
姑苏洛言9 分钟前
扫码小程序实现仓库进销存管理中遇到的问题 setStorageSync 存储大小限制错误解决方案
前端·后端
烛阴19 分钟前
JavaScript 的 8 大“阴间陷阱”,你绝对踩过!99% 程序员崩溃瞬间
前端·javascript·面试
光而不耀@lgy24 分钟前
C++初登门槛
linux·开发语言·网络·c++·后端
lkbhua莱克瓦2428 分钟前
用C语言实现——一个中缀表达式的计算器。支持用户输入和动画演示过程。
c语言·开发语言·数据结构·链表·学习方法·交友·计算器
Mr__Miss32 分钟前
面试踩过的坑
java·开发语言
啊丢_34 分钟前
C++——Lambda表达式
开发语言·c++
lh_12541 小时前
ECharts 地图开发入门
前端·javascript·echarts
jjw_zyfx1 小时前
成熟的前端vue vite websocket,Django后端实现方案包含主动断开websocket连接的实现
前端·vue.js·websocket
Chh07151 小时前
《R语言SCI期刊论文绘图专题计划》大纲
开发语言·r语言