做工程师不做码农@JavaScript面试问题:函数式编程


做工程师不做码农@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面试问题:函数式编程
文章图片
JavaScript函数是一等对象 , 因为它们像任何其他类型的对象一样被对待 。
这意味着函数可以存储在变量 , 对象或数组中 。 它们可以作为参数传递给函数 。 同样 , 它们可以从函数中返回 。
例如 , 我们可以将函数分配给变量 , 如下所示:letfoo=()=>{};
我们为变量foo分配了一个箭头函数 。
同样 , 它们可以作为参数传递 , 如下所示:letfoo=()=>{console.log('foo');};letbar=(fn)=>fn();bar(foo);
然后 , 我们可以传入foo来调用bar 。 请注意 , 我们只是传入foo的引用 , 而没有调用它 。 因此 , 在foo之后没有括号 。
【做工程师不做码农@JavaScript面试问题:函数式编程】可以通过以下函数返回它们: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]();
做工程师不做码农@JavaScript面试问题:函数式编程
文章图片
arguments对象是一个类似数组的对象 , 它具有我们传递给函数的参数 。 类似数组的意思是它具有length属性 , 我们可以通过使用索引来获取项目 , 从而循环遍历所有项目 , 但是它没有像map , reduce或filter这样的数组方法 。
它仅得到传统函数的参数 。