声明式和函数式 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语句。
  • 使用模板字面量:模板字面量提供了一种更灵活的字符串拼接方式,可以在字符串中直接嵌入变量,简化了字符串的构建过程,使代码更加清晰易读。
相关推荐
lilu88888881 小时前
AI代码生成器赋能房地产:ScriptEcho如何革新VR/AR房产浏览体验
前端·人工智能·ar·vr
Eiceblue1 小时前
Python 合并 Excel 单元格
开发语言·vscode·python·pycharm·excel
LCG元1 小时前
Vue.js组件开发-实现对视频预览
前端·vue.js·音视频
傻小胖1 小时前
shallowRef和shallowReactive的用法以及使用场景和ref和reactive的区别
javascript·vue.js·ecmascript
阿芯爱编程1 小时前
vue3 react区别
前端·react.js·前端框架
烛.照1032 小时前
Nginx部署的前端项目刷新404问题
运维·前端·nginx
YoloMari2 小时前
组件中的emit
前端·javascript·vue.js·微信小程序·uni-app
CaptainDrake2 小时前
力扣 Hot 100 题解 (js版)更新ing
javascript·算法·leetcode
浪浪山小白兔2 小时前
HTML5 Web Worker 的使用与实践
前端·html·html5
SomeB1oody2 小时前
【Rust自学】15.2. Deref trait Pt.1:什么是Deref、解引用运算符*与实现Deref trait
开发语言·后端·rust