🎬 HoRain 云小助手:个人主页
⛺️生活的理想,就是为了理想的生活!
⛳️ 推荐
前些天发现了一个超棒的服务器购买网站,性价比超高,大内存超划算!忍不住分享一下给大家。点击跳转到网站。
目录
JavaScript高效工具函数封装指南:15个提升开发效率的必备技巧
一、为什么需要封装工具函数?
典型开发痛点场景
// 问题代码示例:多个页面存在相似逻辑
function formatDate1(date) { /* 实现A */ }
function formatDate2(dt) { /* 实现B */ }
function showTime(time) { /* 实现C */ }
封装后的收益
- 统一维护:核心逻辑单点修改,全项目生效
- 类型安全:统一参数校验与错误处理
- 性能优化:避免重复创建相似函数的内存消耗
二、基础工具函数封装
1. 防抖与节流函数
// 防抖函数封装(最后一次操作后触发)
const debounce = (fn, delay = 300) => {
let timer = null;
return (...args) => {
clearTimeout(timer);
timer = setTimeout(() => fn.apply(this, args), delay);
};
};
// 节流函数封装(固定间隔触发)
const throttle = (fn, interval = 1000) => {
let lastTime = 0;
return (...args) => {
const now = Date.now();
if (now - lastTime >= interval) {
fn.apply(this, args);
lastTime = now;
}
};
};
// 使用示例:搜索框输入防抖
searchInput.addEventListener('input', debounce(searchHandler, 500));
2. 日期格式化统一处理
// 支持多种格式的日期格式化
const formatDate = (date, format = 'YYYY-MM-DD') => {
const dt = new Date(date);
const pad = (n) => n.toString().padStart(2, '0');
return format
.replace('YYYY', dt.getFullYear())
.replace('MM', pad(dt.getMonth() + 1))
.replace('DD', pad(dt.getDate()))
.replace('HH', pad(dt.getHours()))
.replace('mm', pad(dt.getMinutes()));
};
// 使用示例
console.log(formatDate(new Date(), 'YYYY/MM/DD HH:mm')); // 输出:2025/03/17 09:40
三、数据处理高阶函数
1. 安全深拷贝实现
// 支持基础类型/数组/对象的深拷贝
const deepClone = (obj, cache = new WeakMap()) => {
if (obj === null || typeof obj !== 'object') return obj;
if (cache.has(obj)) return cache.get(obj);
const clone = Array.isArray(obj) ? [] : {};
cache.set(obj, clone);
Object.keys(obj).forEach(key => {
clone[key] = deepClone(obj[key], cache);
});
return clone;
};
// 使用示例
const original = { a: 1, b: [2, { c: 3 }] };
const cloned = deepClone(original);
2. 对象属性过滤
// 保留/排除指定属性
const filterObject = (obj, keys, exclude = false) => {
return Object.keys(obj).reduce((acc, key) => {
if (exclude ? !keys.includes(key) : keys.includes(key)) {
acc[key] = obj[key];
}
return acc;
}, {});
};
// 使用示例
const user = { id: 1, name: 'John', age: 30, email: 'john@example.com' };
const publicInfo = filterObject(user, ['name', 'age']); // 保留姓名和年龄
四、DOM操作工具集
1. 元素尺寸监听器
// 监听元素尺寸变化
const observeResize = (element, callback) => {
const observer = new ResizeObserver(entries => {
entries.forEach(entry => {
callback(entry.contentRect);
});
});
observer.observe(element);
return () => observer.disconnect();
};
// 使用示例
const cleanup = observeResize(document.getElementById('box'), (rect) => {
console.log('新尺寸:', rect.width, rect.height);
});
2. 批量事件绑定
// 安全事件绑定与自动解绑
const bindEvents = (element, eventHandlers) => {
const listeners = [];
Object.entries(eventHandlers).forEach(([event, handler]) => {
element.addEventListener(event, handler);
listeners.push({ event, handler });
});
return () => {
listeners.forEach(({ event, handler }) => {
element.removeEventListener(event, handler);
});
};
};
// 使用示例
const cleanup = bindEvents(button, {
click: handleClick,
mouseover: showTooltip
});
五、实用高阶函数
1. 异步重试机制
// 带指数退避的重试函数
const retry = async (fn, retries = 3, delay = 1000) => {
try {
return await fn();
} catch (error) {
if (retries <= 0) throw error;
await new Promise(resolve => setTimeout(resolve, delay));
return retry(fn, retries - 1, delay * 2); // 指数退避
}
};
// 使用示例
const fetchData = () => axios.get('/api/data');
retry(fetchData, 4).then(handleSuccess).catch(handleError);
2. 函数执行时间统计
// 性能调试工具函数
const withTimer = (fn) => (...args) => {
const start = performance.now();
try {
const result = fn(...args);
console.log(`执行耗时: ${(performance.now() - start).toFixed(2)}ms`);
return result;
} catch (error) {
console.log(`执行失败: ${(performance.now() - start).toFixed(2)}ms`);
throw error;
}
};
// 使用示例
const heavyCalculation = withTimer((nums) => nums.reduce((a, b) => a + b, 0));
heavyCalculation(Array(1000000).fill(1));
六、工程化扩展建议
-
模块化管理
创建utils
目录统一存放工具函数:src/ ├── utils/ │ ├── date.js # 日期处理 │ ├── dom.js # DOM操作 │ └── network.js # 网络相关
-
单元测试
使用Jest编写测试用例:// __tests__/deepClone.test.js test('深拷贝嵌套对象', () => { const obj = { a: { b: [1, 2] } }; const cloned = deepClone(obj); expect(cloned).not.toBe(obj); expect(cloned.a.b).toEqual([1, 2]); });
-
TypeScript支持
添加类型声明文件:// types/utils.d.ts declare module '@/utils/debounce' { export function debounce<T extends (...args: any[]) => any>( fn: T, delay?: number ): (...args: Parameters<T>) => void; }
通过系统化封装这些工具函数,可显著提升开发效率。建议根据团队需求补充更多实用函数,并通过文档注释说明使用场景和参数要求,形成可复用的前端工具库。
❤️❤️❤️本人水平有限,如有纰漏,欢迎各位大佬评论批评指正!😄😄😄
💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍
🔥🔥🔥Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙