当前位置: 首页 > news >正文

javascript基础二十五:说说你对函数式编程的理解?优缺点?

在这里插入图片描述
一、是什么

函数式编程是一种"编程范式"(programming paradigm),一种编写程序的方法论

主要的编程范式有三种:命令式编程,声明式编程和函数式编程

相比命令式编程,函数式编程更加强调程序执行的结果而非执行的过程,倡导利用若干简单的执行单元让计算结果不断渐进,逐层推导复杂的运算,而非设计一个复杂的执行过程

举个粟子,将数组每个元素进行平方操作,命令式编程与函数式编程如下

// 命令式编程
var array = [0, 1, 2, 3]
for(let i = 0; i < array.length; i++) {array[i] = Math.pow(array[i], 2)
}// 函数式方式
[0, 1, 2, 3].map(num => Math.pow(num, 2))

简单来讲,就是要把过程逻辑写成函数,定义好输入参数,只关心它的输出结果

即是一种描述集合和集合之间的转换关系,输入通过函数都会返回有且只有一个输出值

在这里插入图片描述
可以看到,函数实际上是一个关系,或者说是一种映射,而这种映射关系是可以组合的,一旦我们知道一个函数的输出类型可以匹配另一个函数的输入,那他们就可以进行组合

二、概念

纯函数

函数式编程旨在尽可能的提高代码的无状态性和不变性。要做到这一点,就要学会使用无副作用的函数,也就是纯函数

纯函数是对给定的输入返还相同输出的函数,并且要求你所有的数据都是不可变的,即纯函数=无状态+数据不可变

在这里插入图片描述
举个粟子:

let double = value=>value*2;

特性:

  • 函数内部传入指定的值,就会返回确定唯一的值
  • 不会造成超出作用域的变化,例如修改全局变量或引用传递的参数

优势:
使用纯函数,我们可以产生可测试的代码

test('double(2) 等于 4', () => {expect(double(2)).toBe(4);
})

不依赖外部环境计算,不会产生副作用,提高函数的复用性
可读性更强 ,函数不管是否是纯函数 都会有一个语义化的名称,更便于阅读
可以组装成复杂任务的可能性。符合模块化概念及单一职责原则

高阶函数

在我们的编程世界中,我们需要处理的其实也只有“数据”和“关系”,而关系就是函数

编程工作也就是在找一种映射关系,一旦关系找到了,问题就解决了,剩下的事情,就是让数据流过这种关系,然后转换成另一个数据,如下图所示

在这里插入图片描述

在这里,就是高阶函数的作用。高级函数,就是以函数作为输入或者输出的函数被称为高阶函数

通过高阶函数抽象过程,注重结果,如下面例子

const forEach = function(arr,fn){for(let i=0;i<arr.length;i++){fn(arr[i]);}
}
let arr = [1,2,3];
forEach(arr,(item)=>{console.log(item);
})

上面通过高阶函数 forEach来抽象循环如何做的逻辑,直接关注做了什么

高阶函数存在缓存的特性,主要是利用闭包作用

const once = (fn)=>{let done = false;return function(){if(!done){fn.apply(this,fn);}else{console.log("该函数已经执行");}done = true;}
}

柯里化

柯里化是把一个多参数函数转化成一个嵌套的一元函数的过程

一个二元函数如下:

let fn = (x,y)=>x+y;

转化成柯里化函数如下:

const curry = function(fn){return function(x){return function(y){return fn(x,y);}}
}
let myfn = curry(fn);
console.log( myfn(1)(2) );

上面的curry函数只能处理二元情况,下面再来实现一个实现多参数的情况

// 多参数柯里化;
const curry = function(fn){return function curriedFn(...args){if(args.length<fn.length){return function(){return curriedFn(...args.concat([...arguments]));}}return fn(...args);}
}
const fn = (x,y,z,a)=>x+y+z+a;
const myfn = curry(fn);
console.log(myfn(1)(2)(3)(1));

关于柯里化函数的意义如下:

  • 让纯函数更纯,每次接受一个参数,松散解耦
  • 惰性执行

组合与管道

组合函数,目的是将多个函数组合成一个函数

举个简单的例子:

function afn(a){return a*2;
}
function bfn(b){return b*3;
}
const compose = (a,b)=>c=>a(b(c));
let myfn =  compose(afn,bfn);
console.log( myfn(2));

可以看到compose实现一个简单的功能:形成了一个新的函数,而这个函数就是一条从 bfn -> afn 的流水线

下面再来看看如何实现一个多函数组合:

const compose = (…fns)=>val=>fns.reverse().reduce((acc,fn)=>fn(acc),val);

compose执行是从右到左的。而管道函数,执行顺序是从左到右执行的

const pipe = (…fns)=>val=>fns.reduce((acc,fn)=>fn(acc),val);

组合函数与管道函数的意义在于:可以把很多小函数组合起来完成更复杂的逻辑

三、优缺点

优点

  • 更好的管理状态:因为它的宗旨是无状态,或者说更少的状态,能最大化的减少这些未知、优化代码、减少出错情况
  • 更简单的复用:固定输入->固定输出,没有其他外部变量影响,并且无副作用。这样代码复用时,完全不需要考虑它的内部实现和外部影响
  • 更优雅的组合:往大的说,网页是由各个组件组成的。往小的说,一个函数也可能是由多个小函数组成的。更强的复用性,带来更强大的组合性
  • 隐性好处。减少代码量,提高维护性

缺点:

  • 性能:函数式编程相对于指令式编程,性能绝对是一个短板,因为它往往会对一个方法进行过度包装,从而产生上下文切换的性能开销
  • 资源占用:在 JS 中为了实现对象状态的不可变,往往会创建新的对象,因此,它对垃圾回收所产生的压力远远超过其他编程方式
  • 递归陷阱:在函数式编程中,为了实现迭代,通常会采用递归操作

相关文章:

javascript基础二十五:说说你对函数式编程的理解?优缺点?

一、是什么 函数式编程是一种"编程范式"&#xff08;programming paradigm&#xff09;&#xff0c;一种编写程序的方法论 主要的编程范式有三种&#xff1a;命令式编程&#xff0c;声明式编程和函数式编程 相比命令式编程&#xff0c;函数式编程更加强调程序执行…...

常见JavaScript加密算法、JS加密算法

常见JavaScript加密算法、JS加密算法 一、SHA-256加密算法二、Base64编码算法三、RSA加密算法四、AES加密算法五、HMAC-SHA256算法六、PKCS7填充 一、SHA-256加密算法 SHA-256是一种密码散列函数&#xff0c;可以将任意长度的消息压缩成256位的摘要值。以下是使用JavaScript实现…...

题解2023.6.5

D - Factorial Divisibility 对于a[i]>x的数一定可以整除&#xff0c;考虑a[i]<x的数&#xff0c;因为(x1)*x! (x1)! 统计ai出现的次数, 把他转换为大的阶乘, 如果, 最终1到x - 1, ai的出现次数均为0则说明可以被x!整除 #pragma GCC optimize(2) #pragma GCC optimiz…...

与声音计算研究相关的挑战赛——DCASE和L3DAS

前言&#xff1a;在本专栏的系列博文中&#xff0c;我将包含声学场景识别、声音事件检测、声源位置估计等利用机器学习或深度学习技术进行研究的、基于声音信号的相关工作成为“声音计算”。 本篇博文主要介绍与声音计算相关的两个近些年持续跟进的挑战赛&#xff1a;DCASE和L…...

实训总结-----Scrapy爬虫

1.安装指令 pip install scrapy 2.创建 scrapy 项目 任意终端 进入到目录(用于存储我们的项目) scrapy startproject 项目名 会在目录下面 创建一个以 项目名 命名的文件夹 终端也会有提示 cd 项目名 scrapy genspider example example.com 3.运行爬虫指令 scrapy craw…...

前端开发职业规划指南:如何做好职业规划与发展

引言 前端开发是目前互联网行业中最火热的职业之一&#xff0c;也是非常具有发展前景的职业之一。随着互联网技术的不断更新和发展&#xff0c;前端开发的职业规划也在不断地发生变化。本文将从几个方面来探讨前端开发的职业规划。 一、职业发展路径 1.前端初级工程师 前端初…...

创业第一步:如何写好商业计划书

即使你的项目不需要融资&#xff0c;你也把标准商业计划书作为一个工具模板来应用&#xff0c;帮助更全面的盘点你要做的事情。 撰写一份性感的商业计划书如同造房子&#xff1a;第一步是科学设计&#xff0c;打好结构&#xff08;有清晰的撰写逻辑&#xff09;&#xff1b;第…...

【Linux驱动】字符设备驱动相关宏 / 函数介绍(module_init、register_chrdev)

驱动运行有两种方式&#xff1a; 方式一&#xff1a;直接编译到内核&#xff0c;Linux内核启动时自动运行驱动程序方式二&#xff1a;编译成模块&#xff0c;使用 insmod 命令加载驱动模块 我们在调试的时候&#xff0c;采用第二种方式是最合适的&#xff0c;每次修改驱动只需…...

axios解决跨域问题

Vue3中使用axios访问聚合的天气API&#xff0c;出现跨域问题&#xff0c;需要在前端进行一些配置&#xff1a; 首先是修改vue.config.js&#xff1a; const { defineConfig } require(vue/cli-service) module.exports defineConfig({transpileDependencies: true,devServe…...

R语言作图——热图聚类及其聚类结果输出

代码 不多说了&#xff0c;做个记录&#xff0c;代码如下。 library(pheatmap) library(RColorBrewer) # args commandArgs(TRUE) betafile "twist_common_panel_434.csv" infofile "twist_common_panel_434.txt" title "twist_common_panel&qu…...

Tomcat优化

Tomcat优化 Tomcat默认安装下的缺省配置并不适合生产环境&#xff0c;它可能会频繁出现假死现象需要重启&#xff0c;只有通过不断压测优化才能让它最高效率稳定的运行。优化主要包括三方面&#xff0c;分别为操作系统优化&#xff08;内核参数优化&#xff09;&#xff0c;Tom…...

我的GIT练习TWO

目录 前言 GIT安装教程 Git作者 GIT优点 GIT缺点 为什么要使用 Git GIT练习TWO C1 C2 C3 C4 C5 C6 C7 总结 前言 Git 是一个分布式版本控制及源代码管理工具;Git 可以为你的项目保存若干快照&#xff0c;以此来对整个项目进行版本管理 GIT安装教程 点击进入查看教程…...

个人器件库整理

样品本 包含如下&#xff1a; 电容器件&#xff1a; 元件值封装备注钽电容47uF 10V1206钽电容10uF 10V1206电容10uF 10% 10V0603X5R&#xff0c;CL10A106KP8NNNC 元件值封装备注100nF电容50V&#xff0c;10%0603 电阻器件&#xff1a; 元件值封装备注75 Ω \Omega Ω…...

javascript——内存管理

JavaScript内存管理是Web开发中的一个重要主题。正确管理内存可以提高应用程序的性能和稳定性。本文将介绍JavaScript中的内存管理概念、常见的内存泄漏问题以及一些有效的内存管理技巧。 什么是JavaScript内存管理&#xff1f; JavaScript具有自动内存管理机制&#xff0c;开…...

Qt5.15.2安卓Android项目开发环境配置

1、Qt Creator 4.11.2 官方下载&#xff1a;https://download.qt.io/archive/qtcreator/4.11/4.11.2/ 镜像下载&#xff1a;https://mirrors.cloud.tencent.com/qt/archive/qtcreator/4.11/4.11.2/ 2、Qt 5.15.2 Android 官方更新器内部下载 参考&#xff1a;https://blog…...

第四十三章 弹跳训练2(灵识扫描)

“再不脱离便会陷死在里面。”这个声音似乎来自脑海深处某个隐秘角落。 双眼一睁&#xff0c;灵识退去&#xff0c;空空的头壳兀自嗡嗡作响&#xff0c;一股说不清道不明的失落感笼罩全身&#xff0c;似要将自己拖入抑郁的谷底。 不&#xff01;没什么好失落沮丧的&#xff01;…...

【location对象的方法,history对象,navigator--BOM】

location对象的方法 location.assign()//跟href一样&#xff0c;可以跳转页面&#xff08;也称重定向页面&#xff09; location.replace()//替换当前页面&#xff0c;因为不记录历史&#xff0c;所以不能后退页面 location.reload()//重新加载页面&#xff0c;相当于刷新按钮或…...

论文笔记:Normalizing Flows for Probabilistic Modeling and Inference

Abstract 正则流&#xff08;Normalizing flows&#xff09;提供了一种通用的机制来定义富有表达力的概率分布&#xff0c;只需要指定一个&#xff08;通常简单的&#xff09;基础分布和一系列可逆变换。 Intraduction 正则流通过将简单的密度通过一系列变换来产生更丰富、可…...

java 异常类介绍

Java 异常&#xff08;Exception&#xff09;是指在程序运行期间出现的错误或异常情况。Java 异常处理机制允许程序在出现异常情况时进行处理&#xff0c;避免程序崩溃或出现不可预知的错误 一、Java 异常的概念 Java 异常是指程序在运行期间出现的错误或异常情况。Java 异常…...

shiro 550 反序列化rce

Apach shiro 是一款开源安全框架&#xff0c;提供身份验证&#xff0c;授权&#xff0c;会话管理等。 shiro 550 反序列化漏洞rce 通关利用它反序列化的漏洞直接执行rce 加密的用户信息序列化后储存在名为remenber -me的cooike中。攻击者可以使用shiro默认密钥伪造cooike&am…...

【C++】---模板初阶(超详练气篇)

个人主页&#xff1a;平行线也会相交&#x1f4aa; 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 平行线也会相交 原创 收录于专栏【C之路】&#x1f48c; 本专栏旨在记录C的学习路线&#xff0c;望对大家有所帮助&#x1f647;‍ 希望我们一起努力、成长&…...

windows系统典型漏洞分析

内存结构 缓冲区溢出漏洞 缓冲区溢出漏洞就是在向缓冲区写入数据时&#xff0c;由于没有做边界检查&#xff0c;导致写入缓冲区的数据超过预先分配的边界&#xff0c;从而使溢出数据覆盖在合法数据上而引起系统异常的一种现象。 ESP、EPB ESP&#xff1a;扩展栈指针&#xff08…...

WPF开发txt阅读器:需求分析和文件读写

文章目录 需求分析读取文本文件保存文本文件 需求分析 尽管现在比较主流的阅读格式已经是epub, modi之类的&#xff0c;但txt的使用范围要远比前两者广泛&#xff0c;所以做一个txt阅读器还是有必要的。 但是对于书籍阅读而言&#xff0c;纯文本不包含目录信息&#xff0c;这…...

C++服务器框架开发9——日志系统LogFormatter_4/各个类的关系梳理/std::function/std::get

该专栏记录了在学习一个开发项目的过程中遇到的疑惑和问题。 其教学视频见&#xff1a;[C高级教程]从零开始开发服务器框架(sylar) 上一篇&#xff1a;C服务器框架开发8——日志系统LogFormatter_3/override/宏定义优化switchcase结构 C服务器框架开发9——日志系统LogFormatt…...

arm平台上的MNN编译与运行

0.成果物 直接获取成果物见&#xff1a;https://download.csdn.net/download/u012824853/87867665 以下为编译、运行过程 1.编译准备 在GitHub - alibaba/MNN: MNN is a blazing fast, lightweight deep learning framework, battle-tested by business-critical use cases …...

python 编译安装指定版本 for linux

python环境是linux中必备的&#xff0c;部分发行版会自带python&#xff0c;有时候需要安装手动安装 注意&#xff1a;如果需要多个版本并存&#xff0c;建议使用conda环境&#xff0c;如果自己配置多版本&#xff0c;需要用多个软链接 conda环境&#xff0c;可以参考&#x…...

在Linux系统下基于Docker搭建Redis集群

创建镜像 #部署Redis集群&#xff0c;该集群有3个节点; --cluster-enabled yes允许启用集群; docker create --name redis-node--01 --net host -v /data/redis-data/node1:/data redis:5.0.5 --cluster-enabled yes --cluster-config-file redis-node--01.conf --port 6379…...

牛客网刷题Day5

1.内容中可以使用哪个元素来表示 <article> 标签外的内容&#xff1f; A aside B cite C article D class 正确答案&#xff1a;A 解析&#xff1a;<aside> 标签定义 <article> 标签外的内容&#xff0c;aside 的内容应该与附近的内容相关 2. 以下的HTML代码…...

Vue.js 中的动态组件是什么?如何使用动态组件?

Vue.js 中的动态组件是什么&#xff1f;如何使用动态组件&#xff1f; Vue.js是一种流行的前端框架&#xff0c;它提供了一种称为“动态组件”的技术&#xff0c;使得我们可以动态地切换组件的内容和结构。在本文中&#xff0c;我们将深入探讨Vue.js中的动态组件&#xff0c;包…...

2023年京东618预售数据:传统滋补成预售黑马,预售额超27亿

这一期主要分享一下此次京东618预售期间的一个黑马行业——传统滋补。不管是从预售量和预售额来看&#xff0c;传统滋补品类的成绩都是此次大促中的佼佼者。 究其原因&#xff0c;近几年养生滋补也掀起了一股“国潮风”。在小红书、抖音等社交平台上&#xff0c;关于“健康养生…...

女生做网站编辑好吗/网站页面禁止访问

C代码管理没有规矩很难管理&#xff0c;不像类管理那样方便&#xff0c;我们一遍一遍的写代码但是重复的很多&#xff0c;如何管理自己写的C程序以供以后使用方便&#xff1f;因此好用的C代码管理小工具出现了&#xff0c;可用于代码管理&#xff0c;将计算机里面的代码导入到数…...

在线平面设计网站哪个好/制作网页教程

当系统初始化完毕后会进入homeactivity&#xff1a;具体代码流程&#xff1a;ActivityManagerService.java --public void systemReady(final Runnable goingCallback) {...mMainStack当系统初始化完毕后会进入homeactivity&#xff1a;具体代码流程&#xff1a;ActivityManage…...

门头沟网站建设公司/万能bt搜索引擎网站

流媒体指的是在网络中使用流技术传输的连续时基媒体&#xff0c;其特点是在播放前不需要下载整个文件&#xff0c;而是采用边下载边播放的方式&#xff0c;它是视频会议、IP电话等应用场合的技术基础。RTP是进行实时流媒体传输的标准协议和关键技术&#xff0c;本文介绍如何在L…...

怎样做网站标题的图标/深圳网站优化平台

现在我们可以安全地使用 SVG 图像&#xff0c;除非您有很多用户使用 IE8 以及更低版本&#xff0c;或者使用较旧的 Android 设备。这种情况下&#xff0c;依然存在着备选方案。 SVG 是一种 vector 图像文件格式。这使得它们与其他图像格式&#xff08;如 PNG、GIF 或 JPG&am…...

做网站找哪家公司比较好/网络营销推广的方法有哪些

公司新电脑&#xff0c;因为公司原因需要要电脑上加域加密&#xff0c;且不能用超级管理员用户&#xff0c;只能是自己的普通用户。因此碰到了个大坑&#xff0c;刚开始还不确定是什么原因&#xff01;&#xff01;经过一天的反复折腾&#xff0c;最后还是找公司运维开了权限解…...

代刷网站系统怎么做/hao123文件在哪里

在php.ini里设置&#xff0c;打开 php.ini 文件&#xff0c;搜索下就可以找到。always_populate_raw_post_data On另外&#xff0c;HTTP_RAW_POST_DATA 这个手册里有介绍。http://zhidao.baidu.com/question/559805700.html转载于:https://blog.51cto.com/332374363/1715189...