📸 [手写代码] Lodash API
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;
}