🚀 如何优化JavaScript中的循环和条件语句
欢迎来到我的博客文章!所有文章都是满满的前端干货,文章简明扼要。
🔄 一、循环优化策略
1. 避免在循环条件中重复计算
// ❌ 反例(每次迭代都重新计算 .length)
for (let i = 0; i < arr.length; i++) { /* ... */ }
// ✅ 优化(缓存长度)
for (let i = 0, len = arr.length; i < len; i++) { /* ... */ }
// 或 for...of(更现代、简洁,且对 Array/TypedArray/Map/Set 优化良好)
for (const item of arr) { /* ... */ }
2. 优先使用 for...of 或 forEach,慎用 for...in
🌟 推荐循环方式:
- for...of:遍历数组、Set、Map 等可迭代对象
- forEach:函数式编程风格,代码简洁
- for...in:仅用于遍历对象属性,避免用于数组
3. 避免在循环内创建函数或对象
✅ 最佳实践:事件委托 + dataset(避免大量闭包)
4. 大数据量:考虑分片(Chunking)或 Web Worker
若需处理 >10k 条数据,同步循环会阻塞主线程 → 页面卡顿。
✅ 方案:setTimeout 分片
function processChunk(items, chunkSize = 1000) {
let i = 0;
function doChunk() {
const end = Math.min(i + chunkSize, items.length);
for (; i < end; i++) {
// process items[i]
}
if (i < items.length) setTimeout(doChunk, 0);
}
doChunk();
}
🔧 进阶方案: - requestIdleCallback:空闲时执行
- Web Worker:彻底移出主线程,适合计算密集型
🧠 二、条件语句优化
1. 条件顺序:高频分支前置
JavaScript 引擎(如 V8)会对条件分支做预测优化,高频路径放前面可减少跳转开销:
if (type === 'A') {
// ...
} else if (type === 'B') {
// ...
} else {
// rare case
}
2. 多分支 → 用 Map 或 Object 查表代替 if-else/switch
| 方案 | 适用场景 | 特点 |
| 对象字面量 | key 是固定字符串 | V8 优化最好,简洁高效 |
| Map | 需要动态增删或 key 非字符串 | 支持任意类型 key,不影响原型链 |
方案一:对象查表法(Object Literal)
// ✅ 推荐:当 key 是「固定字符串」时,用纯对象最简洁高效
const operations = {
add: (a, b) => a + b,
sub: (a, b) => a - b,
mul: (a, b) => a * b,
div: (a, b) => b !== 0 ? a / b : NaN,
mod: (a, b) => a % b,
pow: (a, b) => Math.pow(a, b),
};
function calculate(op, a, b) {
const fn = operations[op];
if (!fn) throw new Error(`Unknown operator: ${op}`);
return fn(a, b);
}
方案二:Map 查表法
// ✅ 推荐:当需要「动态增删」或「key 非字符串」时
const operations = new Map([
['add', (a, b) => a + b],
['sub', (a, b) => a - b],
]);
operations.set('sqrt', (a) => Math.sqrt(a));
operations.set(1001, specialHandler);
function calculate(op, ...args) {
const fn = operations.get(op);
if (!fn) throw new Error(`Unknown operator: ${op}`);
return fn(...args);
}
3. 避免深层嵌套 → 提前 return
// ❌ 深层嵌套
function processUser(user) {
if (user) {
if (user.isActive) {
if (user.hasPermission) {
// 处理逻辑
}
}
}
}
// ✅ 提前 return
function processUser(user) {
if (!user) return;
if (!user.isActive) return;
if (!user.hasPermission) return;
}
🎯 核心优化原则: - 减少重复计算:缓存循环条件和复杂表达式
- 选择合适的循环:for...of > forEach > for > for...in
- 大数据分片处理:避免阻塞主线程
- 高频分支前置:利用分支预测优化
- 查表替代多分支:Object/Map 比 if-else 更高效
- 扁平化代码结构:提前 return 减少嵌套