场景:购物车动画卡成PPT
// 菜鸟写法(每秒60次全局地震)
setInterval(() => {
cartItems.forEach(item => {
item.style.top = `${Math.sin(Date.now())*10}px`; // 持续触发回流
});
}, 16);
// 老司机优化(GPU加速の奥义)
function smoothAnimation() {
requestAnimationFrame(() => {
const translateY = Math.sin(Date.now())*10;
cartItems.forEach(item => {
item.style.transform = `translateY(${translateY}px)`; // 触发GPU加速
});
});
}
性能对比:
方案 | FPS | CPU占用 | 手机发热量 |
---|---|---|---|
原始写法 | 12 | 78% | 可煎鸡蛋 |
优化后 | 60 | 9% | 微微暖手 |
灵魂拷问:
为什么transform比top性能好?—— 就像搬家时打包所有东西一次运走,比来回跑20趟高效!
场景:万级数据列表点击卡顿
// 新手の灾难(内存泄漏警告!)
document.querySelectorAll('.item').forEach(el => {
el.addEventListener('click', handleClick);
});
// 神の操作(一个监听器统治所有)
document.getElementById('list').addEventListener('click', e => {
if(e.target.matches('.item')) { // 精准定位目标
handleClick(e);
}
});
内存对比:
避坑指南:
遇到动态元素就上事件委托,就像学校装个校长信箱,比给每个学生配秘书靠谱!
场景:输入即搜索导致API爆炸
// 青铜写法(老板的服务器杀手)
searchInput.addEventListener('input', async () => {
const results = await fetch(`/search?q=${input.value}`);
// 每敲一次键盘就请求...RIP服务器
});
// 王者方案(优雅の三重奏)
const search = _.debounce(async (query) => {
const results = await fetch(`/search?q=${query}`);
}, 300); // Lodash真香警告!
// 自己手写防抖(面试装逼必备)
function myDebounce(fn, delay) {
let timer;
return (...args) => {
clearTimeout(timer);
timer = setTimeout(() => fn(...args), delay);
};
}
请求量对比:
场景:SPA应用越用越卡
// 内存泄漏经典案例(新手坟场)
function initComponent() {
const hugeData = new Array(1e6).fill('⚠️'); // 百万级数据
document.getElementById('btn').addEventListener('click', () => {
console.log(hugeData.length); // 闭包强引用hugeData!
});
}
// 优化方案(及时分手快乐)
function initComponent() {
const hugeData = new Array(1e6).fill('✅');
const handler = () => {
console.log('点击时不需要大数据');
};
document.getElementById('btn').addEventListener('click', handler);
// 组件卸载时记得离婚!
onUnmounted(() => {
btn.removeEventListener('click', handler);
hugeData = null; // 斩断情丝
});
}
内存回收:
闭包就像前任,该放手时就放手!Chrome DevTools的Memory面板是你的捉鬼敢死队
场景:大数据处理导致界面冻结
// 主线程の哀嚎
function heavyTask() {
for(let i=0; i<1e8; i++){ /* 密集计算 */ }
// 此时页面已冻成狗
}
// 开启多线程の奇迹
const worker = new Worker('task.js');
worker.postMessage({ data: hugeData });
worker.onmessage = (e) => {
updateUI(e.data);
};
// task.js内容
self.onmessage = ({data}) => {
const result = doHeavyWork(data);
self.postMessage(result);
};
性能提升:
场景:暴力遍历 vs 哈希映射
// 菜鸟のO(n²)暴力美学
function findDuplicate(arr) {
for(let i=0; i
复杂度对比:
数据量 | 暴力解法 | 优化方案 |
---|---|---|
1万 | 4950万次操作 | 1万次操作 |
10万 | 死机 | 10万次操作 |