面试手写代码系列
防抖节流
函数防抖关注一定时间连续触发,只在最后执行一次,而函数节流侧重于一段时间内只执行一次。
防抖
//定义:触发事件后在n秒内函数只能执行一次,如果在n秒内又触发了事件,则会重新计算函数执行时间。//搜索框搜索输入。只需用户最后一次输入完,再发送请求//手机号、邮箱验证输入检测 onchange oninput事件//窗口大小Resize。只需窗口调整完成后,计算窗口大小。防止重复渲染。const debounce = (fn, wait, immediate) => {let timer = null;return function (...args) {if (timer) clearTimeout(timer);if (immediate && !timer) {fn.call(this, args);}timer = setTimeout(() => {fn.call(this, args);}, wait);};};const betterFn = debounce(() => console.log("fn 防抖执行了"), 1000, true);document.addEventListener("scroll", betterFn);复制代码
节流
//定义:当持续触发事件时,保证隔间时间触发一次事件。//1. 懒加载、滚动加载、加载更多或监听滚动条位置;//2. 百度搜索框,搜索联想功能;//3. 防止高频点击提交,防止表单重复提交;function throttle(fn,wait){let pre = 0;return function(...args){let now = Date.now();if( now - pre >= wait){fn.apply(this,args);pre = now;}}}function handle(){console.log(Math.random());}window.addEventListener("mousemove",throttle(handle,1000));复制代码
对象深浅拷贝
//浅拷贝1. Object.assign(target,source)2. es6对象扩展运算符。//深拷贝function deepClone(obj) {if (!obj || typeof obj !== "object") return;let newObj = Array.isArray(obj) ? [] : {};for (let key in obj) {if (obj.hasOwnProperty(key)) {newObj[key] = typeof obj[key] === "object" ? deepClone(obj[key]) : obj[key];}}return newObj;}复制代码
数组去重,数组对象去重
//数组const arr = [2,7,5,7,2,8,9];console.log([...new Set(arr)]); // [2,7,5,8,9];//对象const list = [{age:18,name:'张三'},{age:18,name:'李四'},{age:18,name:'王五'}]let hash = {};const newArr = arr.reduce((item, next) => {hash[next.age] ? '' : hash[next.age] = true && item.push(next);return item;}, []);console.log(list);复制代码
数组扁平化
function flatten(arr) {return arr.reduce((result, item) => {return result.concat(Array.isArray(item) ? flatten(item) : item);}, []);}复制代码
