前端手写代码题笔记汇总

2021-10-18 16:20:20

0

前言

  • 本文用于总结一些常见的前端代码手写题

正文

防抖与节流

  • 防抖
debounce(fn, delay): void {
  if (this.timer) {
    alert(\"请不要频繁操作\");
    clearTimeout(this.timer);
  }
  this.timer = setTimeout(fn, delay);
}
  • 节流
// func是用户传入需要防抖的函数
// wait是等待时间
throttle(func, wait = 50){
  // 上一次执行该函数的时间
  let lastTime = 0
  return function(...args) {
    // 当前时间
    let now = +new Date()
    // 将当前时间和上一次执行函数时间对比
    // 如果差值大于设置的等待时间就执行函数
    if (now - lastTime > wait) {
      lastTime = now
      func.apply(this, args)
    }
  }
}

setInterval(
  throttle(() => {
    console.log(1)
  }, 500),
  1
)

快排

var quickSort = function (arr) {
    if (arr.length <= 1) {
        return arr;
    }
    // 从数组中取出中间元素作为基准点
    var pivotIndex = Math.floor(arr.length / 2);
    var pivot = arr.splice(pivotIndex, 1)[0];
    // 左侧数组
    var left = [];
    // 右侧数组
    var right = [];

    // 将元素分为左右两组,小于基准点排给左边,大于基准点的排到右边
    for (var i = 0; i < arr.length; i++) {
        if (arr[i] < pivot) {
            left.push(arr[i]);
        } else {
            right.push(arr[i]);
        }
    }
    // 进行递归排序,按左-中-右进行数组拼接
    return quickSort(left).concat([pivot], quickSort(right));
};

柯里化函数

const curry = (fn, arr = []) => (...args) => (
  arg => arg.length === fn.length
    ? fn(...arg)
    : curry(fn, arg)
)([...arr, ...args])

let curryTest=curry((a,b,c,d)=>a+b+c+d)
curryTest(1,2,3)(4) //返回10
curryTest(1,2)(4)(3) //返回10
curryTest(1,2)(3,4) //返回10