从不一样的角度描述Web前端事件传递,函数式编程之高阶函数,快来收藏

本文介绍了JavaScript中的高级函数,如times函数、every和some数组操作函数,以及sort函数的高阶用法。通过实例演示和函数抽象,展示了函数式编程的思想和优势,旨在提升开发者对这些实用工具的理解和应用。
摘要由CSDN通过智能技术生成

下面来看另一个名为 times 的高阶函数,它接受一个数字,并根据调用者提供的次数调用传入的函数,代码如下

`// es6-functional.js

const times = (times,fn) => {

for(let i = 0; i < times; i++)

fn(i)

}`

times 与 forEach 函数类似,不同的是我们操作的是一个 number 而不是 array,如果要输出 0 - 99 中的偶数,就可以这么用

`times(100,function(n){

unless(n % 2,function(){

console.log(n + " 是偶数")

})

})`

我们将上面的代码抽象出循环,条件判断被放在一个简明的高阶函数中。

3.3 真实的高阶函数

上一节我们写了几个简单的高阶函数,这一节我们将了解真实的高阶函数, 并从简单的高阶函数开始,逐步进入复杂的高阶函数,这些函数都是 JavaScript 开发者日常中会用到的。

3.3.1 every 函数

我们经常需要检查数组的内容是否为数字,数组或其他类型,一般情况下,我们编写典型的循环方法来解决这个问题。但是,下面将这些抽象到一个 every 函数中,它接收两个参数:一个数组和一个函数,它使用传入的函数检查数组的所有元素是否为 true,其实就是数组的 every 方法

`// es6-functional.js

const every = (arr, fn) => {

let result = true;

for(let i = 0,len = arr.length; i < len; i++){

result = result && fn(arr[i])

}

return result;

}`

在此处,我们简单的遍历传入的数组,并使用当前遍历的数组元素内容调用 fn。注意传入的 fn 需要返回一个布尔值。然后我们用 && 运算确保所有的数组内容遵循 fn 给出的条件。

让我们测试一下,传入一个 NaN 数组,isNaN 作为 fn 传入,他会检查给定的数字是否为 NaN

`every([NaN,NaN,NaN], isNaN)

// true

every([NaN,NaN,4], isNaN)

// false`

every 函数是一个典型的高阶函数,实现简单而且非常有用。在继续之前,我们需要了解一下 for…of 循环,它是 ES6 规范的一个部分,用于遍历数组元素,下面用 for … of 循环重写 every 函数

`// es6-functional.js

const every = (arr, fn) => {

let result = true;

for(const value of arr){

result = result && fn(value)

}

return result;

}`

for…of 也是旧的 for(…) 循环的抽象,通过隐藏索引变量移除了对数组的遍历。我们使用 every 抽象出了 for…of,这就是抽象。如果下一个版本的 JavaScript 改变了 for…of 的使用方式,我们只需在 every 函数中修改,这就是抽象函数最大的好处。

3.3.2 some 函数

与 every 函数类似,还有一个 some 函数,也是数组的一个方法,some 函数的工作方式和 every 相反,只要数组中的任意一个元素通过传入的函数返回 true,some 函数就将返回 true。some 函数也被称为 any 函数。为实现some 函数,我们需要使用 || 而不是 &&,具体代码如下

`// es6-functional.js

const some = (arr,fn) => {

let result = false;

for(const value of arr){

result = result||fn(value)

}

return result;

}`

注意:这里的 some 和 every 函数都是低效的实现。every 应该在遇到第一个不匹配的元素时就停止遍历数组,some 应该在遇到第一个匹配的元素时就停止遍历数组,在这里只是为了理解高阶函数的概念,而不是为了编写高效的代码

有了 some 函数,就可以通过传入如下数组检验一下结果

`some([NaN,NaN,4], isNaN)

// true

some([3,4,4], isNaN)

// false`

了解了 some 和 every 是如何工作的,下面来看看 sort 函数以及高阶函数如何在其中使用的。

3.3.3 sort 函数

sort 函数是 Array 原型的内置函数。假设我们需要给一个水果列表排序:

var fruit = ['cherries','apples','bananas'];

你可以简单地调用 sort 函数

`fruit.sort();

// [‘apples’,‘bananas’,‘cherries’];`

它还可以接受一个 compare 函数,如果未提供的话,则会按照 unicode 编码顺序排序。我们可以通过自己提供的 compare 函数来排序任何 JavaScript 数据。sort 函数灵活的原因要归功于高阶函数的本质!

在编写 compare 函数之前,我们先看看它实际上应该实现什么

`function compare(a, b){

if(/* 根据某种排序标准 a < b */){

return -1;

}

if(/* 根据某种排序标准 a > b */){

return 1;

}

return 0;

}`

举个简单的例子,假设我们有一个人员列表

`var people = {

{firstname: “aaFirstName”, lastname: “cclastName”},

{firstname: “ccFirstName”, lastname: “aalastName”},

{firstname: “bbFirstName”, lastname: “bblastName”},

}`

现在需要使用对象中的 firstname 键对人员进行排序,以如下形式传入 compare

`people.sort((a,b) => {

return (a.firstname < b.firstname) ? -1:(a.firstname > b.firstname) ? 1:0

/*

if(a.firstname < b.firstname){

return -1;

}else if(a.firstname > b.firstname){

return 1

}else{

return 0

}

*/

})`

上面的代码将返回如下数据

`[

{ firstname: ‘aaFirstName’,lastName: ‘cclastName’},

{ firstname: ‘bbFirstName’,lastName: ‘bblastName’},

{ firstname: ‘ccFirstName’,lastName: ‘aalastName’},

]`

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024c (备注前端)
img

总结:

  • 函数式编程其实是一种编程思想,它追求更细的粒度,将应用拆分成一组组极小的单元函数,组合调用操作数据流;

  • 它提倡着 纯函数 / 函数复合 / 数据不可变, 谨慎对待函数内的 状态共享 / 依赖外部 / 副作用;

Tips:

其实我们很难也不需要在面试过程中去完美地阐述出整套思想,这里也只是浅尝辄止,一些个人理解而已。博主也是初级小菜鸟,停留在表面而已,只求对大家能有所帮助,轻喷🤣;

我个人觉得: 这些编程范式之间,其实并不矛盾,各有各的 优劣势

理解和学习它们的理念与优势,合理地 设计融合,将优秀的软件编程思想用于提升我们应用;

所有设计思想,最终的目标一定是使我们的应用更加 解耦颗粒化、易拓展、易测试、高复用,开发更为高效和安全

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
img

浅尝辄止,一些个人理解而已。博主也是初级小菜鸟,停留在表面而已,只求对大家能有所帮助,轻喷🤣;

我个人觉得: 这些编程范式之间,其实并不矛盾,各有各的 优劣势

理解和学习它们的理念与优势,合理地 设计融合,将优秀的软件编程思想用于提升我们应用;

所有设计思想,最终的目标一定是使我们的应用更加 解耦颗粒化、易拓展、易测试、高复用,开发更为高效和安全

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
[外链图片转存中…(img-h00O5VjI-1712472016951)]

  • 11
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值