// 像这样的简单回调 const result = array.map(x => x * 2); // 引擎可能会优化成类似这样 const result = new Array(array.length); for (let i = 0; i < array.length; i++) { result[i] = array[i] * 2; // 直接内联,无函数调用 }
console.time('for循环'); let sum = 0; for (let i = 0; i < testArray.length; i++) { sum += testArray[i]; } console.timeEnd('for循环');
性能: 约 2.87ms
不可替代的优势:
// 1. 可以提前退出 for (let i = 0; i < array.length; i++) { if (array[i] === target) { break; // 找到就停止 } } // 2. 可以控制循环方向 for (let i = array.length - 1; i >= 0; i--) { // 倒序处理 } // 3. 可以控制步长 for (let i = 0; i < array.length; i += 2) { // 每隔一个元素处理 } // 4. 可以同时处理多个数组 for (let i = 0; i < array1.length; i++) { const result = array1[i] + array2[i]; }
6. for...of循环 - 语法最美
console.time('for...of'); let sum = 0; for (const item of testArray) { sum += item; } console.timeEnd('for...of');
性能: 约 4.25ms
独特价值:
// 1. 遍历任何可迭代对象 for (const [key, value] of myMap) { console.log(key, value); } // 2. 遍历DOM集合 for (const element of document.querySelectorAll('.item')) { element.classList.add('active'); } // 3. 遍历字符串 for (const char of 'Hello') { console.log(char); }
性能波动的科学解释
为什么每次测试结果都有差异?
1. 垃圾回收(Garbage Collection)
// 测试前后可能触发GC,影响计时准确性 const temp = new Array(100000); // 可能触发GC
2. 即时编译(JIT Compilation)
• 首次执行:解释执行
• 多次执行:编译优化
• 热点代码:深度优化
3. 系统资源波动
• 其他应用程序占用CPU
• 内存压力变化
• 浏览器标签页活动
4. 优化去优化循环
// 如果引擎发现优化假设错误,会"去优化" function process(array) { // 如果array类型变化,会导致去优化 return array.map(x => x * 2); }
// 推荐:优化版for循环 function processLargeArray(array) { const result = new Array(array.length); // 缓存长度,避免重复查询 for (let i = 0, len = array.length; i < len; i++) { result[i] = expensiveOperation(array[i]); } return result; }