前端面试题

一、实现一个斐波拉契数列函数,接受参数为n,返回数列第n项的值,并且要做缓存处理。

  思路:[1,1,2,3,5,8...],从第3(即数组下标为2)项开始,每项都是前两项数之和,这样的数列成为斐波拉契数列。所以,求第n项的值,那就从第n项开始,使用递归逐渐往前面计算。

const arr = []; //定义数组做缓存使用,每次计算的结果存入arr
function feb(n) {
  if(n === 0) return 0;
    if(n === 1 || n === 2) return 1;
    //每次计算时对数组做判断,看第n项的结果是否已经存入数组中了,如果是,直接返回数组存储的结果并提前结束了递归
    if(arr[n]) return arr[n];
    arr[n] = feb(n - 2) + feb(n - 1);
    return arr[n];
}

二、节流和防抖

  • 节流:规定某个操作多久执行一次,例如鼠标滚动,只要滚动就会无限触发滚动事件,这是一种浪费,我们不需要触发这么多次。
    let canMove = true;
    function saveTrigger() {
      if (!canMove) return;
      canMove = false;
      console.log(1);
      setTimeout(() => {
        canMove = true;
      }, 300)
    }

    虽然只要滚动就会无限触发saveTrigger事件,但是仍然300ms才会打印一次。

  • 防抖:多长时间内连续触发一个事件时,不执行相关绑定事件。直到确认停止触发后再去执行事件函数。
    let timer = null;
    function preventShaking(){
        if (timer) {
            clearTimeout(timer);
        }
      timer = setTimeout(() => {
            console.log(1)
        }, 300);        
    }

    当每次触发时间间隔300ms以内时,清除了相关执行。只有停止触发300ms之后,才执行相关操作。

三、深拷贝

function deepCopy(data){
  if (!data || typeof data !== 'object') return data;
  let copyData = null;
  if (data instanceof Array) {
    copyData = [];
  } else {
    copyData = {};
  }
  for(let key in data) {
    copyData[key] = deepCopy(data[key]);
  }
  return copyData;
}

 

posted @ 2021-03-08 16:59  傻白有点甜  阅读(65)  评论(0)    收藏  举报