blog cover

📸 [手写代码] Lodash API

JavaScript

debounce

防抖。

typescriptCopy
function debounce(fn: Function, wait: number) {

  let timer: number | null

  return function (...param: any[]) {
    // 重置计时器
    if (timer) { clearTimeout(timer) }

    timer = setTimeout(() => {
      // 运行函数
      fn(...param)
      clearTimeout(timer!)
      timer = null
    }, wait);
  }
}

throtle

typescriptCopy
function throtle(fn: Function, wait: number) {
  let timer: number | null

  return function (...params: any[]) {
    if (!timer) {
      timer = setTimeout(() => {
        fn(...params)
        clearTimeout(timer!)
        timer = null
      }, wait);
    }
  }
}
const fn2 = throtle((timer: number) => { console.log(timer); }, 1000);

deepClone

typescriptCopy

/**
 * 数据类型枚举
 */
enum Types {
  "Object" = "Object",
  "Function" = "Function",
  "RegExp" = "Function",
  "Map" = "Function",
  "Set" = "Function",
  "Date" = "Function",
  "Array" = "Function",
  "String" = "Function",
}

/**
 * 判断数据类型
 */
function isType(target: any, type: Types) {
  return Object.prototype.toString.call(target) === `[object ${type}]`;
}

function deepClone(target: any) {
  const result: any = {};
  for (const key in target) {
    const value = target[key];
    if (typeof value !== "object") {
      // 如果是基础数据类型
      // 直接赋值
      result[key] = value;
    } else {
      if (isType(value, Types.Array)) {
        result[key] = [];
        for (const iterator of value) {
          result[key].push(iterator);
        }
      } else if (isType(value, Types.Map)) {
        result[key] = new Map();
        for (const iterator of value.entries()) {
          result[key].set(deepClone(iterator));
        }
      } else if (isType(value, Types.Object)) {
        target[key] = deepClone(value);
      } else if (isType(value, Types.Set)) {
        target[key] = new Set();
        for (const iterator of value) {
          target[key].add(deepClone(iterator));
        }
      } else {
        // Date Regrex等数据类型 调用构造函数
        result[key] = new Object.prototype.constructor(value);
      }
    }
  }

  return result;
}

isEqual

typescriptCopy
function isEqual(source: any, target: any): boolean {
  if (source === target) {
    return true;
  } else if (typeof source === "object" && source !== null && typeof target === "object" && target !== null) {
    const sourceKeys = Object.keys(source);
    const targetKeys = Object.keys(target);
    if (sourceKeys.length !== targetKeys.length) {
      return false;
    }

    for (const key of sourceKeys) {
      if (!isEqual(target[key], source[key])) {
        return false;
      }
    }

    return true;
  }

  return false;
}


2024/04/11 01:36