面试手写代码系列

  1. 防抖节流

函数防抖关注一定时间连续触发,只在最后执行一次,而函数节流侧重于一段时间内只执行一次。

防抖

  1. //定义:触发事件后在n秒内函数只能执行一次,如果在n秒内又触发了事件,则会重新计算函数执行时间。
  2. //搜索框搜索输入。只需用户最后一次输入完,再发送请求
  3. //手机号、邮箱验证输入检测 onchange oninput事件
  4. //窗口大小Resize。只需窗口调整完成后,计算窗口大小。防止重复渲染。
  5. const debounce = (fn, wait, immediate) => {
  6. let timer = null;
  7. return function (...args) {
  8. if (timer) clearTimeout(timer);
  9. if (immediate && !timer) {
  10. fn.call(this, args);
  11. }
  12. timer = setTimeout(() => {
  13. fn.call(this, args);
  14. }, wait);
  15. };
  16. };
  17. const betterFn = debounce(() => console.log("fn 防抖执行了"), 1000, true);
  18. document.addEventListener("scroll", betterFn);
  19. 复制代码

节流

  1. //定义:当持续触发事件时,保证隔间时间触发一次事件。
  2. //1. 懒加载、滚动加载、加载更多或监听滚动条位置;
  3. //2. 百度搜索框,搜索联想功能;
  4. //3. 防止高频点击提交,防止表单重复提交;
  5. function throttle(fn,wait){
  6. let pre = 0;
  7. return function(...args){
  8. let now = Date.now();
  9. if( now - pre >= wait){
  10. fn.apply(this,args);
  11. pre = now;
  12. }
  13. }
  14. }
  15. function handle(){
  16. console.log(Math.random());
  17. }
  18. window.addEventListener("mousemove",throttle(handle,1000));
  19. 复制代码

对象深浅拷贝

  1. //浅拷贝
  2. 1. Object.assign(target,source)
  3. 2. es6对象扩展运算符。
  4. //深拷贝
  5. function deepClone(obj) {
  6. if (!obj || typeof obj !== "object") return;
  7. let newObj = Array.isArray(obj) ? [] : {};
  8. for (let key in obj) {
  9. if (obj.hasOwnProperty(key)) {
  10. newObj[key] = typeof obj[key] === "object" ? deepClone(obj[key]) : obj[key];
  11. }
  12. }
  13. return newObj;
  14. }
  15. 复制代码

数组去重,数组对象去重

  1. //数组
  2. const arr = [2,7,5,7,2,8,9];
  3. console.log([...new Set(arr)]); // [2,7,5,8,9];
  4. //对象
  5. const list = [{age:18,name:'张三'},{age:18,name:'李四'},{age:18,name:'王五'}]
  6. let hash = {};
  7. const newArr = arr.reduce((item, next) => {
  8. hash[next.age] ? '' : hash[next.age] = true && item.push(next);
  9. return item;
  10. }, []);
  11. console.log(list);
  12. 复制代码

数组扁平化

  1. function flatten(arr) {
  2. return arr.reduce((result, item) => {
  3. return result.concat(Array.isArray(item) ? flatten(item) : item);
  4. }, []);
  5. }
  6. 复制代码