前端面试锦集-手写代码篇
Published by xiaoqingjin345@gmail.com at 10/10/2022.

1. 防抖、节流

在线代码实例 https://stackblitz.com/edit/web-platform-hw7nmu?file=script.js,index.html

防抖

概念:一定时间后,代码只执行一次,如果期间重复触发,则重新计时 使用场景:监听窗口大小改变、下拉输入请求接口等

function debounce(fn, time) {
  let timer = null;

  return function () {
    if (timer) {
      clearTimeout(timer);
    }

    timer = setTimeout(fn, time);
  };
}

节流:一定时间内,代码只会执行一次 使用场景:监听滚动事件

function throttle(fn, time) {
  let run = false;

  return function () {
    if (!run) {
      setTimeout(() => {
        fn();
        run = false;
      }, time);
      run = true;
    }
  };
}

实现一个函数,将其中vA为true的对象提升,并删除vA属性,然后返回新对象,

如:

const obj = {
    name: 'I',
    color: 'pink',
    objA: {
        vA: true,
        bg: 'blue',
        objB: {
            bg: 'yellow'
        }
    },
    objC:{
        vA: false,
        bg: 'red'
    }
}

function improveObj() {
    ...
    return newObj;
}
console.log(improveObj(obj)); // { name: 'I', color: 'pink', bg: 'blue', objB: { bg: 'yellow' }, objC:{ vA: false, bg: 'red'}}
/**
 * obj 为初始对象值
 * k 为初始对象键名
 */
function improveObj(obj, k) {
    let res = {};
    let VAEqualTrue = false;
    for (const key in obj) {
        if (Object.prototype.toString.call(obj[key]) === '[object Object]') {
            // 属性值为对象时,递归调用函数
            const curValue = upgrade(obj[key], key);
            res = { ...res, ...curValue };
        }
        else if (key === 'vA' && obj[key] === true) {
            // 属性为vA并且值为true时,记一个flag
            VAEqualTrue = true;
        }
        else {
            // 将属性放入结果
            res = { ...res, [key]: obj[key] };
        }
    }

    if (!VAEqualTrue && k) {
        return { k: res};
    }
    return res;
}
豫ICP备17010879号