JavaScript面试问题:函数式编程

文章图片
是什么使JavaScript成为函数式语言?
函数式编程是一种编程范式 , 指示了我们构建应用程序的方式 。 函数式编程将程序中的函数视为数学函数 。
这意味着我们避免更改状态和创建可变数据 , 它也意味着函数是纯函数 , 也就是说 , 一个函数在相同的输入条件下返回相同的东西 。
函数在函数式编程中也不应该有副作用 , 因为它会使函数不纯 。
JavaScript函数也是一级函数 , 这意味着我们可以用函数作为参数或者函数返回函数 。
它还支持闭包 , 在这里我们返回可以在父函数中使用某些值的函数 。
例如 , JavaScript数组具有map , filter和reduce方法 , 它们采用回调函数来处理数组中的项 。
map , filter和reduce是高阶函数 , 因为它们接受函数作为参数 , 返回函数的函数也是高阶函数 。
例如 , 可以按如下方式使用map方法:constnums=[1,2,3];constdoubleNums=nums.map(x=>x*2);
在上面的代码中 , 我们将函数x=>x*2传递给map 。
x=>x*2执行每个数组项执行指定的计算 , 然后返回具有新值的新数组 , 然后我们得到doubleNum为[2 , 4 , 6] 。

文章图片
【JavaScript面试问题:函数式编程】高阶函数是将函数作为参数或返回函数的函数 。
例如 , 如果我们有:consthoc=(fn)=>fn();hoc(()=>{console.log('foo');});
上面的代码具有hoc函数 , 该函数接受函数fn并运行它 。
然后 , 当我们进行以下调用时:hoc(()=>{console.log('foo');});
然后 , 由于传入的函数在hoc函数中运行 , 因此我们输出了foo 。

文章图片
JavaScript函数是一等对象 , 因为它们像任何其他类型的对象一样被对待 。
这意味着函数可以存储在变量 , 对象或数组中 。 它们可以作为参数传递给函数 。 同样 , 它们可以从函数中返回 。
例如 , 我们可以将函数分配给变量 , 如下所示:letfoo=()=>{};
我们为变量foo分配了一个箭头函数 。
同样 , 它们可以作为参数传递 , 如下所示:letfoo=()=>{console.log('foo');};letbar=(fn)=>fn();bar(foo);
然后 , 我们可以传入foo来调用bar 。 请注意 , 我们只是传入foo的引用 , 而没有调用它 。 因此 , 在foo之后没有括号 。
可以通过以下函数返回它们:letfoo=()=>{return()=>console.log('foo')};foo()();
上面的foo函数返回一个输出'foo'的函数 。
然后我们像在最后一行中那样调用它 。
JavaScript函数也可以存储在对象和数组中 。 例如 , 我们可以这样写:letobj={foo:()=>{console.log("foo");}};obj.foo();
我们将foo函数作为属性放入对象中 , 然后在最后一行中对其进行调用 。
最后 , 我们可以将它们存储在数组中 , 如下所示:constarr=[()=>{console.log("foo");}];arr[0]();
或者我们可以调用push将其放入数组中:constarr=[];arr.push(()=>{console.log("foo");});arr[0]();

文章图片
arguments对象是一个类似数组的对象 , 它具有我们传递给函数的参数 。 类似数组的意思是它具有length属性 , 我们可以通过使用索引来获取项目 , 从而循环遍历所有项目 , 但是它没有像map , reduce或filter这样的数组方法 。
它仅得到传统函数的参数 。
例如 , 我们可以这样写:functionfoo(){console.log(arguments);}foo(1,2,3,4,5);
然后console.log将向我们返回传递给foo的参数 , 即1、2、3、4和5 。
箭头函数没有绑定到arguments对象 , 所以我们不能把所有的参数都用这个对象传递给箭头函数 。
for...of循环也适用于arguments对象 , 因此我们可以如下遍历参数:functionfoo(){for(letargofarguments){console.log(arg);}}foo(1,2,3,4,5);
我们可以使用扩展运算符将参数转换为数组 。 例如 , 我们可以这样写:functionfoo(){console.log([...arguments]);}foo(1,2,3,4,5);
然后 , 我们输出了[1,2,3,4,5] 。 总结
JavaScript具有许多函数式编程功能 。 函数是一等对象 , 这意味着它们像其他任何对象一样被对待 。
它还具有古怪的 , 类似于数组的参数 , 以获取传递给传统函数的参数 。
如果对你有所启发和帮助 , 可以点个关注、收藏 , 也可以留言讨论 , 这是对作者的最大鼓励 。
作者简介:Web前端工程师 , 全栈开发工程师、持续学习者 。
推荐阅读
- 中美关系直击要点!外交部长王毅记者会核心内容精炼 提及中美关系、病毒源头、香港事务等问题
- 环球网王毅:病毒源头问题上,中方与美国一些政客之间的分歧,是真相与谎言的距离,是科学与偏见的对比
- 珠江实业回应上交所问询函 涉及债务结构、财务费用激增等问题
- 男生一旦认定你是“未来媳妇”,才会张嘴问这3问题,渣男做不到
- 每天都打不起精神?不是你睡觉的问题,是你没有吃此类食物!
- 问题疫苗美国计划招募超10万志愿者 测试多种新冠候选疫苗
- 面试运营岗位时自我介绍,这样说更加好!
- 一扭脖子就容易咔咔响,是不是身体健康有问题?你要小心了
- 16个年轻人关心的问题有答案了
- 三星手机又又出问题了:为什么你还在用三星手机?
