声明式和函数式 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语句。
  • 使用模板字面量:模板字面量提供了一种更灵活的字符串拼接方式,可以在字符串中直接嵌入变量,简化了字符串的构建过程,使代码更加清晰易读。
相关推荐
gnip6 小时前
企业级配置式表单组件封装
前端·javascript·vue.js
一只叫煤球的猫7 小时前
写代码很6,面试秒变菜鸟?不卖课,面试官视角走心探讨
前端·后端·面试
excel8 小时前
Three.js 材质(Material)详解 —— 区别、原理、场景与示例
前端
掘金安东尼8 小时前
抛弃自定义模态框:原生Dialog的实力
前端·javascript·github
hj5914_前端新手12 小时前
javascript基础- 函数中 this 指向、call、apply、bind
前端·javascript
薛定谔的算法12 小时前
低代码编辑器项目设计与实现:以JSON为核心的数据驱动架构
前端·react.js·前端框架
Hilaku12 小时前
都2025年了,我们还有必要为了兼容性,去写那么多polyfill吗?
前端·javascript·css
yangcode12 小时前
iOS 苹果内购 Storekit 2
前端
LuckySusu12 小时前
【js篇】JavaScript 原型修改 vs 重写:深入理解 constructor的指向问题
前端·javascript
LuckySusu12 小时前
【js篇】如何准确获取对象自身的属性?hasOwnProperty深度解析
前端·javascript