命令式与声明式代码
这是两种不同的编写代码的方式,我们也称之为范式;
命令式
- 程序员需要解释"如何去一步步的做事";
- 我们向计算机解释它为了达到某一种结果所必须遵循的每一个;
- 例如:需要制作一个蛋糕,我会向食谱一样,需要把每一步都告诉计算机,这样它才能得到一个蛋糕;
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
语句。 - 使用模板字面量:模板字面量提供了一种更灵活的字符串拼接方式,可以在字符串中直接嵌入变量,简化了字符串的构建过程,使代码更加清晰易读。