范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

javascript之函数柯里化(curry)实现add(1)(2)(3)

  前言
  本文主要从 3W (what, how, why) 角度出发通俗易懂地解释一下 什么是函数柯里化,以及怎么用三行代码来实现 add(1)(2)(3) 这是个很常见的面试题。什么是函数柯里化(curry)
  函数柯里化(curry)是函数式编程里面的概念。curry的概念很简单:只传递给函数一部分参数来调用它,让它返回一个函数去处理剩下的参数。
  简单点来说就是:每次调用函数时,它只接受一部分参数,并返回一个函数,直到传递所有参数为止。
  举个
  将下面接受两个参数的函数改为接受一个参数的函数。const add = (x, y) => x + y; add(1, 2);
  改成每次只接受一个参数的函数const add = x => y => x + y; add(1)(2);
  柯里化,不可变数据类型,纯函数等都是函数式编程中的概念。在React中这些概念很常见,因为React中很多涉及到函数式编程的概念。想要具体了解什么是函数式编程,可以查看 JS函数式编程指南add(1)(2)(3)
  我们可以自己先尝试写一个add(1)(2)(3)const add = x => y => z => x + y + z; console.log(add(1)(2)(3));
  看起来并不是那么难,但是如果面试官的要求是实现一个add 函数,同时支持下面这几种的用法呢add(1, 2, 3); add(1, 2)(3); add(1)(2, 3);
  如果还是按照上面的这种思路,我们是不是要写很多种呢...
  我们当然可以自己实现一个工具函数专门来生成 柯里化 函数。
  主要思路是什么呢,要判断当前传入函数的参数个数 (args.length) 是否大于等于原函数所需参数个数 (fn.length) ,如果是,则执行当前函数;如果是小于,则返回一个函数。const curry = (fn, ...args) =>      // 函数的参数个数可以直接通过函数数的.length属性来访问     args.length >= fn.length // 这个判断很关键!!!     // 传入的参数大于等于原始函数fn的参数个数,则直接执行该函数     ? fn(...args)     /**      * 传入的参数小于原始函数fn的参数个数时      * 则继续对当前函数进行柯里化,返回一个接受所有参数(当前参数和剩余参数) 的函数     */     : (..._args) => curry(fn, ...args, ..._args);  function add1(x, y, z) {     return x + y + z; } const add = curry(add1); console.log(add(1, 2, 3)); console.log(add(1)(2)(3)); console.log(add(1, 2)(3)); console.log(add(1)(2, 3));Ramda
  Ramda 中的函数所有都支持柯里化。也就是说,所有的多参数函数,默认都可以使用单参数函数。
  还是举上面的例子吧const addThreeNumbers = (x, y, z) => x + y + z; const curriedAddaddThreeNumbers = R.curry(addThreeNumbers); const f = curriedAddaddThreeNumbers(1, 2); console.log(f(3));
  大名鼎鼎的 lodash 中也提供了 柯里化 函数 ,那么它和Ramda有什么区别呢
  lodash是一个很强大的工具函数库,比如 节流,防抖,深拷贝等等,只要引入 lodash ,我们就可以直接使用。
  Ramda 是一个函数式编程的理念的函数库。柯里化有什么作用
  主要有3个作用: 参数复用、提前返回和 延迟执行
  我们来简单地解释一下:
  参数复用:拿上面 f这个函数举例,只要传入一个参数 z,执行,计算结果就是 1 + 2 + z 的结果,1 和 2 这两个参数就可以直接复用了。
  提前返回 和 延迟执行 也很好理解,因为每次调用函数时,它只接受一部分参数,并返回一个函数(提前返回),直到(延迟执行)传递所有参数为止。
  考点:函数柯里化
  函数柯里化概念: 柯里化(Currying)是把接受多个参数的函数转变为接受一个单一参数的函数,并且返回接受余下的参数且返回结果的新函数的技术。
  1)粗暴版 function add (a) { 	return function (b) { 		return function (c) { 		    return a + b + c; 		} 	} } console.log(add(1)(2)(3)); // 6
  2)柯里化解决方案 参数长度固定 const curry = (fn) => (judge = (...args) =>     args.length === fn.length     ? fn(...args)     : (...arg) => judge(...args, ...arg)); const add = (a, b, c) => a + b + c; const curryAdd = curry(add); console.log(curryAdd(1)(2)(3)); // 6 console.log(curryAdd(1, 2)(3)); // 6 console.log(curryAdd(1)(2, 3)); // 6参数长度不固定 function add (...args) {     //求和     return args.reduce((a, b) => a + b) }  function currying (fn) {     let args = []     return function temp (...newArgs) {         if (newArgs.length) {             args = [                 ...args,                 ...newArgs             ]             return temp         } else {             let val = fn.apply(this, args)             args = [] //保证再次调用时清空             return val         }     } }  let addCurry = currying(add) console.log(addCurry(1)(2)(3)(4, 5)())  //15 console.log(addCurry(1)(2)(3, 4, 5)())  //15 console.log(addCurry(1)(2, 3, 4, 5)())  //15

欧盟推进数字化建设来源人民网欧盟委员会日前批准总额约20亿欧元的绿色和数字转型资金,用于完成数字欧洲项目的部分工作计划,重点针对人工智能公共数据空间网络安全和数字技能共享等领域进行战略投资。欧盟20无视美国命令,欧洲芯片巨头加大供货,抢占中国3000亿美元市场如今的美国是想要单边主义一条路走到黑,不仅仅对华为进行了芯片禁令,而且美国真正要打击的是我国的半导体发展,然而对于我国的打压,美国想要置身事外这也是不可能的,无视美国命令,欧洲芯片研究显示城镇化有助于中国实现碳中和据美国科学日报网站2月22日报道,事实证明,中国从农村向城市的大规模移民对中国的碳储量产生了积极影响。城镇化甚至可以在实现气候中和方面发挥作用。报道称,这是丹麦哥本哈根大学研究人员转角双层石墨烯产生超快光电流研究取得进展近期,中国科学院上海光学精密机械研究所强场激光物理国家重点实验室在激光控制转角双层石墨烯产生超快光电流方面取得新进展。相关研究成果发表于PhysicalReviewB上。超快光学技3月1日后,微信支付宝个人收款码可正常使用!2月22日晚间,中国支付清算协会发布关于优化条码支付服务的公告,宣布现行个人收款码不关闭不停用,同时新设个人经营收款码,服务不减体验不变,并可享受更高效的交易对账等服务。随后,微信五JSONPath使用(Java)1。开发环境JDK1。8SpringBoot2。1。182。添加依赖dependencygroupIdcom。jayway。jsonpathgroupIdjsonpathartif饭店洗碗机多少钱?酒店洗碗机的价格主要取决于清洁能力大小选用机型不同清洗原理不同等因素不同机型的商用洗碗机价格也不尽相同,普通的小型揭盖机一万元左右,而清洁效率明显优于揭盖机的通道式洗碗机,价格在3减肥用的体脂称哪个牌子比较好?这里要先想一下对你而言体脂称应该是什么?对我而言,体脂秤是一个方便自己的工具,在这里可以分享我选体脂秤的思路。1。需要能测量体重外的多项身体数据,并可以看到历史报告2。不用每次测量蔚小理,自动驾驶谁第一?文丨深途(IDshentucar),作者丨黎明,编辑丨魏佳2017年的春天,美国得克萨斯美洲赛道,一辆叫作EP9的电动超跑,在无人驾驶测试中跑出了每小时257公里的成绩,成为当时全乌镇互联网赋能美丽城镇建设千年乌镇,水乡画廊。美丽盈乎全域,文旅奏以雅韵。地连江浙,毗邻京杭古运河互联天下,不愧数字先行地。多年来,乌镇始终聚焦一业一网发展,旅游业保持优势地位,互联网产业持续蓬勃发展。经过28岁字节员工确认离世,给互联网打工人的几点警示想必大家都已经知道最近字节发生的员工猝死事件,如果还不知道,先简单回顾一下3月23日,就在上周,网上流传一份微信聊天记录,这份聊天记录,是字条跳动猝死员工的妻子找群友求助的相关内容
售价79万元的它能够满足当下年轻人?比亚迪元Pro深度体验如果给你79万元预算,购买一辆纯电车的话,你会有怎样的选择?相信这个问题确实不太好回答,毕竟这样的预算在当下的纯电动车市场中能够找到满意答案的车型凤毛菱角。多数的车型因存在续航里程今天支付宝集福正式开启!今天,2021年春节集五福活动正式开启,和往年相同,今年依然集齐五个福字即可合成五福红包,等到除夕夜开奖!支付宝在不断支招教大家使用新功能,目前除了原有的AR扫福写福字得福卡已经开为什么要买新能源车?比亚迪唐dmi注意是我为什么会买,一切购买或推荐还是建立在个人需求上,所以我不是鼓吹新能源汽车的曰1。上牌方便,对于现在一线城市和超线城市,條牌的上牌和不限行不限导真的会方便很多。2。省钱,这个唐Dmi电桩安装记(省钱大法)充电桩的安装历程真的是艰辛呀之前都是用小区的共享充电桩,电费1。7元,太贵了,现在有了自己的充电桩,家用电费0。49,实在!百公里十块钱以内接下来是充电桩安装流程1。电网申请装电表我的新宠,帅气的大唐来了去年就打算买车,后面由于年底的工作耽误了一段时间,就推迟到了现在,之前有看过很多车型,但总有不如人意的地方,对于我这个选择困难症患者来说真的很难做出决定,全新唐还是朋友给推荐的,考深度技术分享如何将win10壁纸设置高清的方法有不少深度技术的用户都不喜欢Windows10系统中,自带的桌面win10壁纸,在网上下载的不少壁纸又不够清晰,要如果设置高清壁纸呢?其实,这个问题真的很容易解决的,比如你可以搜索比亚迪汉给了我十足的温暖自认生活条件还可以,属于比上不足比下有余,过的还算满足,买车的原因其实就两点,一个是挤地铁,时常会闻到不好闻的气味,另一个也是主要原因就是有了小孩,买个车子干什么都还是比较安全和方朋友的比亚迪唐Dmi终于到家啦,最快速度的提车坐标上海,因为大牌贵且难拍,所以直接放弃要大牌的想法了,转战电动汽车,送牌照,完美!从年初就开始想买车了,看了现今市面上很火的各种电动汽车。第一个看的是小鹏p7,小鹏g3,p7的样唐Dmi使用体验和驾驶感受用车感受1。动力这是大家最关心的,因为试驾过唐DM的车友都知道,那四秒多的加速,太猛了,秒天秒地秒空气。唐DMi的动力,完全不用担心!尤其是之前开燃油车的车友,就会感受到质的飞跃。买车买的就是安全,刀片电池yyds今天,我们来聊聊爱车的安全问题。提起新能源车的安全,我们首先想到的肯定是电池的安全性,那么,我购买比亚迪汉ev的时候,选择原因肯定会有刀片电池了。毕竟汉ev是首款搭配刀片电池的新能win10版本关闭防火墙提示关闭通知的解决方法很多深度技术的小伙伴在最新win10版本系统中关闭防火墙后,都会提示弹出关闭通知的问题,那么下面深度系统小编以win10正式版系统为例,来为大家分享具体的解决方法。方法如下1首先我