下面来看另一个名为 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前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip1024c (备注前端)
总结:
-
函数式编程其实是一种编程思想,它追求更细的粒度,将应用拆分成一组组极小的单元函数,组合调用操作数据流;
-
它提倡着 纯函数 / 函数复合 / 数据不可变, 谨慎对待函数内的 状态共享 / 依赖外部 / 副作用;
Tips:
其实我们很难也不需要在面试过程中去完美地阐述出整套思想,这里也只是浅尝辄止,一些个人理解而已。博主也是初级小菜鸟,停留在表面而已,只求对大家能有所帮助,轻喷🤣;
我个人觉得: 这些编程范式之间,其实并不矛盾,各有各的 优劣势。
理解和学习它们的理念与优势,合理地 设计融合,将优秀的软件编程思想用于提升我们应用;
所有设计思想,最终的目标一定是使我们的应用更加 解耦颗粒化、易拓展、易测试、高复用,开发更为高效和安全;
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
浅尝辄止,一些个人理解而已。博主也是初级小菜鸟,停留在表面而已,只求对大家能有所帮助,轻喷🤣;
我个人觉得: 这些编程范式之间,其实并不矛盾,各有各的 优劣势。
理解和学习它们的理念与优势,合理地 设计融合,将优秀的软件编程思想用于提升我们应用;
所有设计思想,最终的目标一定是使我们的应用更加 解耦颗粒化、易拓展、易测试、高复用,开发更为高效和安全;
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
[外链图片转存中…(img-h00O5VjI-1712472016951)]