[函数式]JavaScript面试问题:函数式编程
文章图片
文章图片
是什么使JavaScript成为函数式语言?
函数式编程是一种编程范式 , 指示了我们构建应用程序的方式 。函数式编程将程序中的函数视为数学函数 。
这意味着我们避免更改状态和创建可变数据 , 它也意味着函数是纯函数 , 也就是说 , 一个函数在相同的输入条件下返回相同的东西 。
函数在函数式编程中也不应该有副作用 , 因为它会使函数不纯 。
JavaScript函数也是一级函数 , 这意味着我们可以用函数作为参数或者函数返回函数 。
它还支持闭包 , 在这里我们返回可以在父函数中使用某些值的函数 。
例如 , JavaScript数组具有 map , filter 和 reduce 方法 , 它们采用回调函数来处理数组中的项 。
map , filter 和 reduce 是高阶函数 , 因为它们接受函数作为参数 , 返回函数的函数也是高阶函数 。
例如 , 可以按如下方式使用 map 方法:const nums = [1,2,3]; const doubleNums = nums.map(x => x*2);
在上面的代码中 , 我们将函数 x => x * 2 传递给 map 。
x => x * 2 执行每个数组项执行指定的计算 , 然后返回具有新值的新数组 , 然后我们得到 doubleNum 为 [2 , 4 , 6] 。
文章图片
文章图片
高阶函数是将函数作为参数或返回函数的函数 。
例如 , 如果我们有:const hoc = (fn)=> fn(); hoc(()=>{console.log('foo'); });
上面的代码具有 hoc 函数 , 该函数接受函数 fn 并运行它 。
然后 , 当我们进行以下调用时:hoc(()=>{console.log('foo'); });
然后 , 由于传入的函数在 hoc 函数中运行 , 因此我们输出了 foo 。
文章图片
文章图片
JavaScript函数是一等对象 , 因为它们像任何其他类型的对象一样被对待 。
这意味着函数可以存储在变量 , 对象或数组中 。它们可以作为参数传递给函数 。同样 , 它们可以从函数中返回 。
例如 , 我们可以将函数分配给变量 , 如下所示:let foo = () => {};
我们为变量 foo 分配了一个箭头函数 。
同样 , 它们可以作为参数传递 , 如下所示:let foo = () => {console.log('foo'); }; let bar = (fn) => fn(); bar(foo);
然后 , 我们可以传入 foo 来调用 bar 。请注意 , 我们只是传入 foo 的引用 , 而没有调用它 。因此 , 在 foo 之后没有括号 。
可以通过以下函数返回它们:let foo = () => {return ()=> console.log('foo') }; foo()();
上面的 foo 函数返回一个输出 'foo' 的函数 。
然后我们像在最后一行中那样调用它 。
JavaScript函数也可以存储在对象和数组中 。例如 , 我们可以这样写:let obj = {foo: () => {console.log("foo");} }; obj.foo();
我们将 foo 函数作为属性放入对象中 , 然后在最后一行中对其进行调用 。
最后 , 我们可以将它们存储在数组中 , 如下所示:const arr = [() => {console.log("foo");} ]; arr[0]();
或者我们可以调用 push 将其放入数组中:const arr = []; arr.push(() => {console.log("foo"); }); arr[0]();
文章图片
文章图片
推荐阅读
- ■面试官求你了,别再问我HTTPS
- 「面试」如何在视频面试中脱颖而出
- 『JavaScript』种草 ES2020 八大新功能
- 「人人都是产品经理」四象限选拔法:从面试官角度,看数据产品经理的面试和选拔
- 『人生第一份工作』解答字节跳动产品面试题:如何设计积分抽奖?
- 【Redis】阿里面试官让我用Zk(Zookeeper)实现分布式锁
- 人生第一份工作■在做技术面试官时,我是这样甄别大忽悠的
- 「深度学习」深度学习面试必备的 25 个问题
- 【JSP】我说我不会JSP,面试官就让我回去等通知了
- 「」Python3中lambda表达式与函数式编程讲解