首页 > 其他分享 >前端面试题

前端面试题

时间:2022-08-19 22:02:05浏览次数:60  
标签:面试题 return 函数 前端 args arr item const

1.函数柯里化

柯里化就是将一个接收多个参数的函数转化为一系列使用一个参数的函数的技术。实现的效果就是:

const fun = (a, b, c) => {return [a, b, c]};

//上述函数经过科里化后就是
const curriedFun = curry(fun);
// curriedFun的调用变为 curriedFun(a)(b)(c)

下面我们来看看curry函数应该怎么实现:

// 观察上诉柯里化调用发现,它其实就是把参数都搜集起来了,每次调用搜集几个参数
// 当搜集的参数足够时执行主方法
const curry = (fn) => {
  // 先记录主方法原始的参数个数,fn.length就是函数接收的参数个数
  const parmasLength = fn.length;

  return executeFun = (...args) => {
    // 如果接收参数够了,执行主方法
    if(args.length >= parmasLength) {
      return fn(...args);
    } else {
      // 如果参数不够,继续接收参数
      return (...args2) => {
        // 注意executeFun接收的参数是平铺的,需要将数组解构
        return executeFun(...args.concat(args2));
      }
    }
  }
}

// 现在看下结果
curriedFun(1)(2)(3); // [1, 2, 3]
curriedFun(1, 2)(3); // [1, 2, 3]
curriedFun(1, 2, 3); // [1, 2, 3]

 

2.数组扁平化

这个数组有很多层,我们现在需要将它变成一层的应该怎么做呢?结合我们reduce和递归写出这个方法:

const flat = (arr, initVal) => {
  const startVal = initVal || [];
  return arr.reduce((prevRes, item) => {
    // 如果里层还是数组,递归调用自身
    if(Array.isArray(item)){
      return flat(item, prevRes);
    }else{
      return prevRes.concat(item);
    }
  }, startVal)
}

const arr = [1, 2, [3, 4], [5, 6, [7, 8]]];
const flatArr = flat(arr);

console.log(flatArr); // [1, 2, 3, 4, 5, 6, 7, 8]

如果我们想对递归的层数进行限制,我们可以再加一个参数来进行控制:

 
const flat = (arr, depth, initVal) => {
  const startVal = initVal || [];
  return arr.reduce((prevRes, item) => {
    // 如果里层还是数组,递归调用自身
    if(Array.isArray(item) && depth > 1){
      return flat(item, depth - 1, prevRes);
    }else{
      return prevRes.concat(item);
    }
  }, startVal)
}

const arr = [1, 2, [3, 4], [5, 6, [7, 8]]];
const flatArr = flat(arr, 1); // 只扁平化一层

console.log(flatArr);

3.防抖函数

 我们有一个需求:实现一个搜索框,当用户连续输入的时候不发请求去搜索,只有当用户输入暂停超过500毫秒才发请求。实现这个需求就需要我们的防抖函数了,因为是等待500毫秒才发起请求,我们很容易就想到了setTimeout,如果timer存在,又触发了这个方法,就把timer清了继续等,知道方法不再触发,timer执行
// 发起请求的函数
const sendRequest = () => {};

// 防抖函数
const debounse = (fn, waitTime) => {
  let timer = null;

  return function() {
    const self = this;
    const args = [].slice.apply(arguments);
    if(timer){
      clearTimeout(timer);
    } else {
      timer = setTimeout(() => {
        fn.apply(self, args);
      }, waitTime);
    }
  }
}

const debounsedSendRequest = debounse(sendRequest, 500);

4.节流函数

节流函数和防抖函数很像,但是针对的需求不一样,比如onScorll方法可能会触发的很频繁,我们不能每次触发的时候都去调回调,会浪费大量性能,我们可能需要每50ms调用一次,那就需要节流函数了:

const scrollHandler = () => {};

const throttle = (fn, waitTime) => {
  let isRunnig = false;
  return (...args) => {
    if(!isRunnig) {
      isRunnig = true;
      setTimeout(() => {
        fn(...args);
        isRunnig = false;
      }, waitTime)
    }
  }
}

const throttledScrollHandler = throttle(scrollHandler, 50);

 

 

 

 

 

 

 

 

 

 

 

                 

标签:面试题,return,函数,前端,args,arr,item,const
From: https://www.cnblogs.com/5idabaicai/p/16603432.html

相关文章

  • sql-面试题
    TopN问题需要确定使用什么排名函数,包含三种函数:row_number()、rank()、dense_rank()每个班级的分数为前3名的学生--建表语句createtablescore(sidstring,classstr......
  • 前端项目中关于深拷贝和浅拷贝的遇见
    项目初次接触:获取的数据赋值给变量,经过开关按钮切换后,数据变了,发现原来只是浅拷贝了。深拷贝:也叫值拷贝浅拷贝:也叫引用拷贝浅拷贝就只是复制对象的引用原始类型......
  • 面试题-三个与SQL相关的问题
    一、SQL语法总结(面试:你能记得有多少种SQL的语法)? 二、select语句的顺序。 三、多表关联中,on与where的区别。 四、左连接、右连接、内连接、交叉连接有什么区别,你在......
  • 一些值得阅读的前端文章(不定期更新)
    1、面向Lighthouse编程与Vue性能优化:https://mp.weixin.qq.com/s/12Xppi2LCXddRWy9Mjw43Q 2、详解HTTPS:https://mp.weixin.qq.com/s/mpoDKIsQbNdpuBNhnvvf-g 3、Web......
  • Vue面试题05:Vue中如何扩展一个组件(应用题)
    Vue中如何扩展一个组件按照逻辑扩展和内容扩展来列举逻辑扩展的方法:mixins、extends、compositionapi内容扩展的方法:slots使用方法、使用场景和问题混入:mixi......
  • Vue面试题04:双向数据绑定相关
    双向数据绑定使用和原理定义:vue中双向绑定就是指v-model指令,可以绑定一个响应式数据到视图,同时视图中变化能同步改变该值。v-model是语法糖,作用在表单项和自定义组件......
  • get请求 空字符串布尔值True? 获取前端输入完整内容
    如下图须知:get请求获取的都是字符串形式;会自动给每个字符加单引号通过request.GET获取完整输入 ......
  • 【nodejs】大事件后台管理项目(三)——layui前端布局
    5.文章管理5.1新建ev_articles表CREATETABLE`my_db_01`.`Untitled`(`Id`int(0)NOTNULLAUTO_INCREMENT,`title`varchar(255)NOTNULLCOMMENT'文章......
  • 小tips:怎样实现简单的前端hash与history路由方式?
    前端路由实现方式,主要有两种,分别是history和hash模式。hash模式不同路由对应的hash是不一样的,如何能够监听到URL中关于hash部分发生的变化?浏览器已经暴露给我们一个现成......
  • 计算机网络常见面试题
    一、计算机网络分层体系结构(五层举例)应用层:为应用程序提供交互服务。在互联网中的应用层协议很多,如域名系统DNS、HTTP协议、SMTP协议等。传输层:负责向两台主机进程之间的......