JavaScript 函数式编程

JavaScript 中的函数式编程是一种编程范式,它将函数作为一等公民来使用。

在函数式编程中,函数是一种特殊的对象,可以赋值给变量、作为参数传递给其他函数、或作为其他函数的返回值。

函数式编程强调了函数的纯函数性,即函数输入相同时,总能得到相同的输出,并且不会对外部状态产生影响。

函数式编程还提倡使用高阶函数,即函数可以作为参数传递给其他函数,或作为其他函数的返回值。

函数式编程还有一些其他的特点,如支持柯里化、组合等概念。

函数式编程在 JavaScript 中得到了广泛的应用,如 lodash, underscore, ramda 等库都是基于函数式编程思想开发的。

在 JavaScript 中,函数式编程也可以通过一些方法来实现,例如:

  • map:对数组中的每一项进行操作,返回一个新数组
  • filter:过滤数组中符合条件的项,返回一个新数组
  • reduce:对数组中的每一项进行操作,将结果累计到一个值中
  • compose:组合多个函数,将其结果嵌套
  • curry:将多参函数转换成一系列单参函数

这些方法都是基于函数式编程思想实现的,它们都是纯函数,不会改变原数组的值,返回的都是新数组,可以组合使用。

在函数式编程中,引入了一些新的概念,例如:

  • Immutable:不可变性,在函数式编程中,数据不可变是很重要的。这意味着一旦数据被创建,它就不能被更改。
  • Referential transparency:引用透明性,这意味着函数的行为只依赖于它的输入,不会依赖于外部环境。
  • Higher-order functions:高阶函数,这意味着函数可以作为参数传递给其他函数,或作为其他函数的返回值。

这些概念都是函数式编程的核心要素,它们帮助我们编写更简洁,更易于理解和维护的代码。

在函数式编程中,我们需要避免使用全局变量和状态,而是使用函数组合来解决问题。

在函数式编程中还有一些重要的概念,如:

  • Monads:一种代码组织方式,帮助我们处理复杂的逻辑
  • Functor:一种数据类型,可以应用一个函数
  • Monoids:一种结构,满足结合律和单位元

这些概念都是函数式编程中的重要组成部分,帮助我们更好的组织代码,处理复杂的逻辑。

作者:yuzhihui
出处:http://www.cnblogs.com/yuzhihui/ 声明:欢迎任何形式的转载,但请务必注明出处!!!
本文转载于网络 如有侵权请联系删除

相关文章

  • 菜鸟国际赵剑:中国产业链高质量增长,国货出海推动国际供应链转型升级

    6月30日,在厦门举行的第十七届中国国际物流节现场,菜鸟国际供应链总经理赵剑接受媒体采访。赵剑表示,随着中国产业链不断高质量增长,国货尤其是中国品牌出海推动了国际供应链转型升级,对整个跨境物流和供应链行业提出更高要求。“我们观察到,越来越多的代工、贴牌生产开始转型做自主品牌出海,加大创新与研发投入,不断向‘微笑曲线’两端延伸。”赵剑告诉记者,以前,传统OEM和ODM往往不能直达消费者,了解消费洞察。如今,中国工厂和工贸一体商家依托跨境电商和独立站直达消费者,对物流的话语权增强。由此,形成需求-设计-制造-物流的闭环供应链,需要更加高效、稳定、高质量的国际供应链服务。据介绍,作为一家全球化物流产业互联网公司,菜鸟的核心战略布局之一就是全球化。截至目前,菜鸟日均跨境包裹量已近500万个,在全世界建设六大核心物流枢纽,包括三百万平米的跨境仓库,触达全球100多个国家、300多个港口的空运、陆运以及海运服务。赵剑称,我们看到整个国际贸易呈现“小批量”“高频次”和“碎片化”特点。即每一海外订单金额“缩水”,但下单频次攀升。所以,亟需高确定性的端到端跨境物流,来保证“小批量”货物的收货安全。同时,

  • 解决 Windows OSError - pydot failed to call GraphViz.Please install GraphViz 报错

    Windows操作系统下,运行pydot相关程序时(我的是keras.utils.plot_model)报错,提示没有安装GraphViz,事实上并不都是因为GraphViz没有安装,本文记录错误解决方法。 问题复现操作系统:Win10 keras版本:2.2.4 在Win10系统下(Windows系列都可能出这个问题)keras建立简单的模型,执行plot_model,报错: importkeras fromkeras.modelsimportModel fromkeras.layersimportInput fromkeras.layersimportConv2D fromkeras.layersimportGlobalAveragePooling2D fromkeras.layersimportDense importnumpyasnp fromkeras.utilsimportplot_model importos os.environ["PATH"]+=os.pathsep+r'E:\ProgramFiles(x86)\Graphviz2.

  • PC/移动端弹出层插件之layer

    还在自己写弹出层吗?亲,我来解决你的烦恼,为你推荐一款多样性、易集成的插件:layer。layer是什么?layer是一款近年来备受青睐的web弹层组件,她具备全方位的解决方案,致力于服务各水平段的开发人员,您的页面会轻松地拥有丰富友好的操作体验。layer兼容了包括IE6在内的所有主流浏览器。layer提供哪些弹出层样式?(以下图片左侧是代码,右侧是效果)(1)、提示层、询问层 (2)、小小tips层(取代title) (3)、页面层、iframe层 (4)、加载层、loading层 (5)、相册层 (6)、tab层(tabbar) 等等。提过多种皮肤,如果觉得不够爽,完全可以自定义。提供完整的api实现代码(1)、html代码中引入layer.js (2)、直接调用,如://询问框 layer.confirm('您是如何看待前端开发?',{ btn:['重要','奇葩']//按钮 },function(){ layer.msg('的确很重要',{icon:1}); },function(){ la

  • react-开发经验分享-自定义封装请求方法(二)

    Author:Mr.柳上原付出不亚于任何的努力愿我们所有的努力,都不会被生活辜负不忘初心,方得始终react里,请务必自己封装请求方法 承接上文》》》 当自定义封装请求方法后,可以简化当前页面的后端数据请求代码 //二次封装页面请求 /** *新增组件 *调用接口方法api */ importApiClient,{callApi}from'@/utils/apiClient';//对接后端,公用接口验证 import{AuthorUrl}from'@/constants/baseConfig';//公用url constaddApi={ postOrganization:async(condition)=>{ leturl=`${AuthorUrl}/api/Organization`; returnawaitcallApi(async()=>{ returnawaitApiClient.post(url,condition); }) } } exportdefaultaddApi;复制/** *删除组件 *调用接口方法api

  • java动态代理

    一、简单实现:packageDemo; importjava.lang.reflect.InvocationHandler; importjava.lang.reflect.Method; importjava.lang.reflect.Proxy; publicclasstest1{ publicstaticvoidmain(String[]args){ Personp=newStudent(); Class[]interfaces={Person.class}; Personperson=(Person)Proxy.newProxyInstance(test1.class.getClassLoader(),interfaces,newInvocationHandler(){ @Override publicObjectinvoke(Objectproxy,Methodmethod,Object[]args)throwsThrowable{ //TODOAuto-generatedmethodstub System.out.println("加油"); p

  • 微信小程序带图片弹窗简单实现

    怎样实现一个带图片显示的模态视图弹窗呢?有时候我们的确有这个需求,自己实现?不不不,哪有官方的方便!使用官方组件实现图片模态弹窗下面我来介绍一种使用官方组件就能实现的方法:(PS:最近发现一个问题,如果页面内有textarea时,textarea的层级会比蒙版视图高,并且无法修改,做了一个比较笨的解决方案:小程序textarea层级问题)(PS:呃呃呃,听说官方的modal组件即将废弃,所以另写了一个可带图片弹窗modal组件,需要可以自取)首先找到官方文档:​显示模态弹窗的APIwx.showModal(OBJECT) wx.showModal参数介绍 发现并没有设置图片的参数,但是这是一个API,但是组件呢?我并没有在官方文档中找到,但是经过尝试发现<modal></modal>是可以显示一个模态弹窗的,即:wx.showModal({ title:'提示', content:'这是一个模态弹窗', success:function(res){ if(res.confirm){ console.log('用

  • WordPress内外链自动添加GO跳转

    经常看到一些博客点击外链跳转到其他网站上的时候都会有一个跳转页面,很是漂亮。据说是有利于SEO,保护站点权重,不过个人只是觉得好看、高逼格便加上了。网上相关的源代码很多,只是代码使用的方法不太详细,对于很多新手小白可能并不友好,希望能够帮助新人快速地使用上这个跳转功能。新建跳转页面首先,将一下代码(来自孟坤博客)复制并保存为一个 index.php文件丢到网站根目录的go文件夹下<?php /** *带有来路验证和跳转提示功能的跳转页面 *@auth孟坤博客 *@authUrlhttp://mkblog.cn *@data2017/3/13 *@urlhttps://mkblog.cn/701 */ //请将这里的网址改为自己的(顶级)域名地址 $myDomain='mkblog.cn'; //这里用正则提取$_SERVER["QUERY_STRING"]而不是直接geturl //是因为如果链接中自身带有GET参数则会导致获取不完整 preg_match('/url=(.*)/i',$_SERVER["Q

  • 学习技能UP:敢爱敢恨敢开口,还怕英语学不好?

    国庆假期的最后一天,是时候收收心,在家好好地歇歇,顺便学习学习,以饱满的精神迎接接下来的学习和工作。对于很多人来说,学好一门语言是很有必要的。但是“纸上得来终觉浅,绝知此事要躬行”,空有理论知识,缺少实践场景的对话,造成了现在许多人都是“哑巴英语”。ATiStudio推出了一款具有语音识别能力的语言学习应用MondlyVR,为用户提供一个互动的沉浸式语言环境。戴上头显后,用户可以和虚拟人物身处于同一个场景进行会话。值得一提的是,会话中的语句都是通过云端推送的,具备机器学习能力,不仅可以为用户演示正确的发音,还可根据上下文不同语境,给出建议短语,并能够随时进行翻译。据悉,MondlyVR可以教授30种语言,如英语、日语、波斯语、普通话和西班牙语等。但可惜的是,MondlyVR对于某些语言的支持还不太稳定。如在GearVR版本中,对于西班牙语的识别效果很好,但对日语的识别效果就不尽人意了。但有些时候,MondlyVR也会出现无法完全解析转录的语言,因此用户总能在屏幕上看到啼笑皆非的一幕:MondlyVR一直在试图翻译你的语言,却总是不对,提示接受的输入是无效的。虽然MondlyVR还有些瑕

  • 十一问MongoDB CTO,谈NoSQL人气王的扩展、事务及运维

    【编者按】在“MongoDB成为首位10亿美元初创”一文中,我们曾介绍过这个千禧年的宠儿——NoSQL领域的人气王,只通过6年时间就将公司市值发展到12亿美元,其成果相当于著名开源公司RedHat20年的发展。总结MongoDB的成功之路,一大部分归功于Web开发者,因为作为一个文档数据库,在许多场景下它都优于RDBMS,同时还可以获得非常高的读性能。此外,动态、灵活的模式更可以让用户在商用服务器上轻松的进行横向扩展。然而还是有很多潜在用户抱有这样的担心——MongoDB的成功是否建立在过度的炒作之下。同时,有些则是担心MongoDB还不够成熟,认为其只适合某些Web应用,并且在事务上存在很大的风险。为了弄清这些问题,近日,InfoWorld的EricKnorr走访了MongoDBCTO兼联合创始人EliotHorowitz。下为采访译文Eric:对于MongoDB,业内通常会有这样一个说法,MongoDB只适合初创公司,可以用它很方便的进行扩展。而对于变化较少的企业级应用程序来说,这点似乎并不需要?Eliot:在与许多企业CIO交流的过程,我有发现,他们受困于许多问题,其中有一个就是

  • UniPro数据查询语言UQL 自建语法模型解决复杂检索

    SQL 是计算机语言中关系型数据库的标准语言,用来存储、检索和修改关系型数据库中存储的数据。所有的关系型数据库管理系统(RDBMS),比如MySQL、Oracle、SQLServer等,都将SQL 作为其标准处理语言。1979 年,Oracle 公司首先提供商用的SQL,随后IBM 公司也在DB2 数据库中实现了SQL。1986 年末,国际标准组织(ISO)将SQL 采纳为国际标准。UniPro作为国内主流的研发类项目管理软件,自建数据查询语言UQL,即UniProQuaryLanguage,它是UniPro系统中的一种搜索语言,支持基于SQL的搜索语法,用户可直接输入自己想要的筛选条件,进行高级检索。与同类型软件Jira相比,UniPro可视化筛选功能有明显提升,拥有且或检索方式,而Jira若要构建或条件只能通过JQL。UniPro上线UQL语句查询后,检索功能更为便捷、易用,在且或查询基础上,提供了更为丰富的语法、函数,覆盖更多复杂的查询场景。在实际使用过程中,可以在任意工作项点开筛选器,即可选择UQL语句查询,如下图所示: 目前,UQL能实现以下列表中的几类搜索需求:UniPro

  • SAP SOAMANAGER报错原因与故障排除方法

      一些刚刚接触到SAP Webservice的开发者由于对SAP Netweaver组件的不熟悉,往往在使用事物码SOAMANAGER进行webservice配置的时候,发现无法正常启动SOAMANAGER,本文将对两种常见的报错进行分析和处理,希望对大家有所帮助。 1. “无法访问此页面”:错误代码INET_E_RESOURCE_NOT_FOUND     原因分析:出现此问题原因是浏览器找不到要访问的地址(即SOAMANAGER所在的URL),找不到要访问的地址,有可能是服务器本身故障了或者网络链接的问题,但如果网络和服务器都正常的话,更大的可能是WEB服务器没有进行被DNS解析到。   解决办法:让服务器的host被DNS解析。查看服务器的hostname很简单,只需要在刚弹出的IE浏览器的地址栏中的URL(如http://XXXX:8000/...)找到“XXXX”即可,这里的“XXXX”就是服务器的hostname。   如果SAP服务器本身没有加入到所在工作环境的域控中,那么服务器的hostname默认是无法被解析到的,则需要对服务

  • NOIP 模拟 $90\; \rm 校门外歪脖树上的鸽子$

    题解\(by\;zj\varphi\) 树上问题,采用树链剖分。 考虑一下线段树区间查询的过程,放到这题上就是:递归下去的从儿子的区间交点分开。 如果递归右儿子,那么就会对左儿子造成贡献,反之同理。 具体实现就是开两棵线段树,一棵表示从右链递归,对左儿子的贡献,另一棵相反。 求出每个点从下往上走左子树到的深度最浅的点,和走右子树到的。 注意根节点的兄弟是它自己。 Code #include<bits/stdc++.h> #definerisigned #definepd(i)++i #definebq(i)--i #definefunc(x)std::function<x> namespaceIO{ charbuf[1<<21],*p1=buf,*p2=buf; #definegc()p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?(-1):*p1++ #definedebug1(x)std::cerr<<#x"="<<x<<

  • redis限流和滑动窗口限流

    一、redissetnx实现限流   比如我们需要在10秒内限定20个请求,那么我们在setnx的时候可以设置过期时间为当前时间戳+10s,使用setnx设置20个互不相同的key,当请求的setnx数量达到20时候即达到了限流效果。   当然这种做法的弊端是很多的,比如当统计1-10秒的时候,无法统计2-11秒之内,如果需要统计N秒内的M个请求,那么我们的Redis中需要保持N个key等等问题   SETNX是SETifNoteXists的简写,日常指令是SETNXkeyvalue,如果key不存在则set成功返回1,如果这个key已经存在了返回0 底层实现包含三个步骤,用lua脚本保证原子性1、get:获取这个key2、比较:比较这个key对应的value是否和自己有关联3、del:删除这个key SETlock_keylock_valueNXPX300001.lock_key:即锁名称,这个名称应是公开的,在分布式环境中,对于某一确定的公共资源,所有争用方(客户端)都应该知道对应锁的名字。对于Redis而言,lock_name就是key-value中

  • mindxdl--common--head_handler.go

    //Copyright(c)2021.HuaweiTechnologiesCo.,Ltd.Allrightsreserved.//Packagecommonthecommonpackageoftheprogrampackagecommonimport("errors""github.com/gin-gonic/gin""golang.org/x/net/context""huawei.com/npu-exporter/hwlog""net/http""strconv")const(base=10bitSize=64//HeaderUserIDKeyHeaderUserIDKeyHeaderUserIDKey="UserID"//HeaderGroupIDKeyHeaderGroupIDKeyHeaderGroupIDKey="GroupID"//HeaderRoleIDKeyHeaderRoleIDKeyHeaderRoleIDKey="RoleID"//HeaderRequestIDKeyHeaderRequestIDKeyHeaderRequestIDKey="RequestID"

  • 大数据Azkaban Work Flow实战

    目录 1HelloWorld案例1.1yarm语法: 2作业依赖案例2.1修改basic.flow为如下内容2.2将修改后的basic.flow和azkaban.project压缩成second.zip文件2.3重复HelloWorld后续步骤。 3自动失败重试案例3.1编译配置流3.2将修改后的basic.flow和azkaban.project压缩成four.zip文件3.3重复HelloWorld后续步骤。3.4执行并观察到一次失败+三次重试3.5也可以点击上图中的Log,在任务日志中看到,总共执行了4次3.6也可以在Flow全局配置中添加任务失败重试配置,此时重试配置会应用到所有Job 4手动失败重试案例4.1编译配置流4.2将修改后的basic.flow和azkaban.project压缩成five.zip文件4.3重复HelloWorld后续步骤。4.4可以根据需求选择性执行对应的任务。 1HelloWorld案例 1)在windows环境,新建azkaban.project文件,编辑内容如下azkaban-flow-version:2.0注意:该文件作用

  • LintCode刷题——硬币排成线I、II

    硬币排成线I: 题目描述: 有n个硬币排成一条线。两个参赛者轮流从右边依次拿走1或2个硬币,直到没有硬币为止。拿到最后一枚硬币的人获胜。 请判定第一个玩家是输还是赢? 样例: n=1,返回true. n=2,返回true. n=3,返回false. n=4,返回true. n=5,返回true. 挑战: O(1)时间复杂度且O(1)存储。 算法分析: 本题一个人可以拿1个或者2个,如果输入的n符合条件,为了确保第一个人拿一定能够赢,则对拿法一定要有要求:第一个人在第一次拿之后一定要保证剩下的物品数量为3的倍数,接下来无论第二个人怎么拿,第一个人还是能把剩下的物品数量控制在3的倍数,因此第一个人一定能够确保自己拿到最后一枚硬币并获胜。因此对于输入的数n,n%3=0时为false,否则为true; 代码(应当是LintCode的最简代码了吧): publicclassSolution{ /* *@paramn:Aninteger *@return:Abooleanwhichequalstotrueifthefirstplayerwillwin */ publicbooleanfir

  • RXD and math

    RXDandmath 题目链接 思路 \(u\)函数是莫比乌斯函数,这个不影响做题,这个式子算的是\([1,n^k]\)中能够写成\(a*b^2\)的数的个数,\(u(a)!=0\).然后我们可以证明任何数都可以唯一写成\(a*b^2\)的形式,因为\(b=p1*p2*..pn\),假设\(a\)中没有\(b\)中的因子,那么肯定是唯一表示的,如果含有\(b\)中的因子如果表示的形式要变,那么肯定要将\(b\)改变,那么如果\(b\)改变的话假设将任意一个\(p\)和\(a\)中的某个不在\(b\)中的质因子互换时,由于\(p\)无论在\(a\)中本来有或没都无法构成平方。快速幂来下就可以了,就是求\(n^k\)复杂度\(O(logn)\) 代码 #include<bits/stdc++.h> usingnamespacestd; typedeflonglongLL; constLLmod=1e9+7; LLquick(LLn,LLm); intmain(void) { LLn,k; int__cn=0; while(scanf("%lld%lld",&n,&

  • Ubuntu 挂载NTFS格式的硬盘权限read-only问题解决

      今天在Ubuntu系统上挂载之前安装windows10系统的硬盘时,发现权限一直为read-only,重新以rw挂载还是不行,在网上查询发现是NTFS格式的问题 需要使用ntfsfix命令,之后再挂载就可以读写了,具体参考这个帖子 https://ubuntuforums.org/showthread.php?t=2379710 发现这个帖子解释了问题的原因https://askubuntu.com/questions/145902/unable-to-mount-windows-ntfs-filesystem-due-to-hibernation/145904#145904 stayhungry,stayfoolish

  • XShell实现自动化执行脚本.sh文件)(网络安全检查)

    1、自动化登录服务器操作: 第一种方式:(login.vbs文件) SubMainxsh.Screen.Send"sshroot@10.99.202.54"xsh.Screen.SendVbCrxsh.Screen.WaitForString"password:"xsh.Screen.Send"TOYxmx$Hpv"xsh.Screen.SendVbCrxsh.Screen.Send"ifconfig"xsh.Screen.SendVbCrEndSub   第二种方式:建立会话实现点击登录   2、执行命令的脚本文件(basci.vbs文件) SubMain xsh.Screen.Send"yuminstalllrzsz-y" xsh.Screen.SendVbCrxsh.Screen.Send"yum-yinstallpsmisc"xsh.Screen.SendVbCr xsh.Screen.Send"yuminstall-yntp" xsh.Screen.SendVbCr xsh.Screen.Send"servicentpdstart" xsh.Scree

  • 奄奄一息雏鸟

    这周二下班之后我在软件园的草坪下看到一只鸟,它旁边还有三只雏鸟,有两只已经横躺着,有一只已经奄奄一息在抖动翅膀;我走近过去想仔细看,那大鸟立即就飞到我头顶的树枝上,依然警惕的瞩视着我。等我在那只大鸟的目送下离开大约有十米左右,它才重新飞下来救它孩子。不知道是谁那么缺德捣了它窝,也许是老鼠,也许是清洁工,也许是刮风,也许是其它鸟类。观察期间我犹豫过是否要救它,但是我不知道如何救它,也会是帮倒忙,因为我连自己都养不活。

  • 十八、MyBaits日志之LOG4J

    Log4j: Log4j是Apache的一个开源项目 控制日志信息输送的目的地是控制台、文件、GUI组件,甚至是套接口服务器、NT的事件记录器、UNIX Syslog守护进程等; 控制每一条日志的输出格式; 通过定义每一条日志信息的级别,制日志的生成过程。 通过一个配置文件来灵活地进行配置,而不需要修改应用的代码。 1.pom.xml <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency>复制 2.log4j.properties #1.根日志 #log4j.rootLogger日志输出类别和级别:只输出不低于该级别的日志信息DEBUG<INFO<WARN<ERROR<FATAL #DEBUG:日志级别logfile1:输出位置自己定义的一个名字logfile2:输出位置自己定义的一个名字 #两

相关推荐

推荐阅读