1.实现浅拷贝
function shallowCopy(obj) { // 如果obj不是对象或者obj是null,直接返回obj if (typeof obj !== 'object' || obj === null) { return obj; } // 判断obj是数组还是对象,创建一个相应的空数组或 对象 let copy = Array.isArray(obj) ? [] : {}; // 遍历obj的所有属性 for (let key in obj) { // 如果属性是obj自身的(不是继承来的) if (obj.hasOwnProperty(key)) { // 将属性复制到新的对象或数组中 copy[key] = obj[key]; } } // 返回新的对象或数组 return copy; }
2.深拷贝
// 定义一个名为deepCopy的函数,接受一个参数obj function deepCopy (obj) { // 如果obj不是对象或者obj是null,直接返回obj // 这是递归的基本情况 if (typeof obj !== 'object' || obj === null) { return obj; } // 根据obj是否为数组,创建一个新的空数组或空对象 let copy = Array.isArray(obj) ? [] : {}; // 遍历obj的所有属性 for (let key in obj) { // 如果当前属性是obj自身的属性(不是从原型链继 承的属性) if (obj.hasOwnProperty(key) ) { // 如果当前属性的值是一个非null对象,递归调用 deepCopy函数 if (typeof obj[key] === 'object' && obj[key] !== null) { copy[key] = deepCopy(obj[key]) } else { // 如果当前属性的值不是对象,直接复制 copy[key] = obj[key] } } } // 返回复制后的对象 return copy; }
3.防抖
function debounce(func, delay) { let timer = null; // 声明一个定时器 // 返回一个函数,这个函数会在一个时间区间结束后的 delay 毫秒时执行 func 函数 return function(...args) { // 每次触发时清除上一次的定时器 if(timer) { clearTimeout(timer); } // 然后设置新的定时器,延迟执行用户传入的方法 timer = setTimeout(() => { func.apply(this, args); }, delay); } }
4.节流
function throttle(func, delay) { let lastTime = 0; // 声明一个变量记录上一次执行的时 间 // 返回一个函数,这个函数会在一个时间区间结束后的 delay 毫秒时执行 func 函数 return function(...args) { // 获取当前时间 let nowTime = Date.now(); // 如果当前时间与上一次执行的时间间隔大于设定的延 迟时间,则执行函数 if (nowTime - lastTime > delay) { func.apply(this, args); // 更新上一次执行的时间 lastTime = nowTime; } } }
5.快速排序
// 定义快速排序函数 function quickSort(arr) { // 如果数组长度小于等于1,无需排序,直接返回 if (arr.length <= 1) { return arr; } // 选择一个基准元素,这里我们选择数组的中间 元素 const middleIndex = Math.floor(arr.length /2); const middle = arr.splice(middleIndex, 1)[0]; // 定义两个数组,left用于存放比基准元素小的元 素,right用于存放比基准元素大的元素 const left = []; const right = []; // 遍历数组,进行划分 for (let i = 0; i < arr.length; i++) { if (arr[i] < middle) { left.push(arr[i]); } else { right.push(arr[i]); } } // 递归地对左右子数组进行快速排序,然后合并 结果 return [...quickSort(left),middle, ...quickSort(right)] }