分享

JavaScript面试问题:函数式编程

 新用户26922hFh 2022-01-22

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]。

  JavaScript面试问题:函数式编程

  高阶函数是将函数作为参数或返回函数的函数。

  例如,如果我们有:

  const hoc=(fn)=> fn();

  hoc(()=>{

  console.log('foo');

  });

  上面的代码具有 hoc 函数,该函数接受函数 fn 并运行它。

  然后,当我们进行以下调用时:

  hoc(()=>{

  console.log('foo');

  });

  然后,由于传入的函数在 hoc 函数中运行,因此我们输出了 foo。

  JavaScript面试问题:函数式编程

  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]();JavaScript面试问题:函数式编程

  arguments 对象是一个类似数组的对象,它具有我们传递给函数的参数。类似数组的意思是它具有 length 属性,我们可以通过使用索引来获取项目,从而循环遍历所有项目,但是它没有像 map,reduce 或 filter 这样的数组方法。

  它仅得到传统函数的参数。

  例如,我们可以这样写:

  function foo() {

  console.log(arguments);

  }

  foo(1, 2, 3, 4, 5);

  然后 console.log 将向我们返回传递给 foo 的参数,即1、2、3、4和5。

  箭头函数没有绑定到 arguments 对象,所以我们不能把所有的参数都用这个对象传递给箭头函数。

  for ... of 循环也适用于 arguments 对象,因此我们可以如下遍历参数:

  function foo() {

  for (let arg of arguments) {

  console.log(arg);

  }

  }

  foo(1, 2, 3, 4, 5);

  我们可以使用扩展运算符将参数转换为数组。例如,我们可以这样写:

  function foo() {

  console.log([...arguments]);

  }

  foo(1, 2, 3, 4, 5);

  然后,我们输出了 [1,2,3,4,5]。

  总结

  JavaScript具有许多函数式编程功能。函数是一等对象,这意味着它们像其他任何对象一样被对待。

  它还具有古怪的,类似于数组的参数,以获取传递给传统函数的参数。

  如果对你有所启发和帮助,可以点个关注、收藏,也可以留言讨论,这是对作者的最大鼓励。

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多