当前位置: 首页 > ops >正文

JavaScript 循环方法对比指南

JavaScript 循环方法对比指南


1. 标准 for 循环

语法:

for (let i = 0; i < arr.length; i++) {console.log(arr[i]);
}

优点

✅ 完全控制索引,适合需要精确控制遍历顺序或步长的场景。
✅ 性能最优,在超大规模数据遍历时比高阶方法(如 forEach)更快。
✅ 支持 break、continue、return,可灵活控制循环流程。

缺点

❌ 代码较冗长,需要手动管理索引。
❌ 不适用于对象遍历(除非结合 Object.keys())。

适用场景

  • 需要基于索引的操作(如逆序遍历、间隔遍历)
  • 性能敏感的场景(如大数据量处理)

2. for…in 循环

语法:

for (const key in obj) {console.log(key, obj[key]);
}

优点

✅ 可遍历对象的所有可枚举属性(包括原型链上的属性)
✅ 适用于普通对象的键值遍历

缺点

❌ 不推荐用于数组,因为会遍历非数字键和原型链属性
❌ 遍历顺序不确定(尤其在涉及继承属性时)
❌ 无法直接获取值,需通过 obj[key] 访问

适用场景

  • 遍历普通对象的属性(需配合 hasOwnProperty 检查)
  • 调试时快速查看对象结构

改进方案

for (const key in obj) {if (obj.hasOwnProperty(key)) {  // 过滤原型链属性console.log(key, obj[key]);
}

3. for…of 循环

语法:

for (const item of iterable) {console.log(item);
}

优点

✅ 直接遍历值,无需手动索引或键名
✅ 支持所有可迭代对象(数组、字符串、Map、Set 等)
✅ 支持 break、continue、return
✅ 代码简洁易读,是"增强 for 循环"的最佳实践

缺点

❌ 不能直接遍历普通对象(需先转换为数组,如 Object.entries(obj))

适用场景

  • 数组或可迭代对象的遍历(推荐替代 forEach)
  • 需要提前终止循环的场景(如查找第一个符合条件的元素)

示例

const arr = [1, 2, 3];
for (const num of arr) {if (num === 2) break;  // 支持 breakconsole.log(num);      // 输出 1
}

4. Array.prototype.forEach

语法:

arr.forEach((item, index) => {console.log(item, index);
});

优点

✅ 函数式编程风格,链式调用方便(如结合 map、filter)
✅ 无需手动管理索引

缺点

❌ 无法中断循环(不支持 break 或 return)
❌ 性能略低于 for 或 for…of(尤其在大数据量时)
❌ 不适用于异步操作(除非配合 async/await 的特殊处理)

适用场景

  • 简单遍历数组且无需中断逻辑
  • 与其他高阶函数(如 map、filter)组合使用

不适用场景

// 错误示例:尝试用 forEach 中断循环
arr.forEach(item => {if (item === 2) break;  // ❌ 报错:Illegal break statement
});

5. 其他遍历方法

方法特点
while / do…while适合条件循环(如读取流数据),但需手动控制终止条件
for await…of异步遍历(如遍历异步生成器或 Promise 数组)
Object.keys() + forEach安全遍历对象属性的替代方案(避免 for…in 的原型链问题)

6. 总结:如何选择循环方法

需求推荐方法
遍历数组且需要中断for…of 或 for
遍历对象属性Object.keys() + forEach 或 for…in(需过滤)
简单数组遍历且无需中断forEach
高性能遍历(大数据量)标准 for 循环
异步遍历for await…of

7. 性能对比(仅供参考)

const largeArray = Array(1e6).fill(0);// 1. 标准 for 循环(最快)
for (let i = 0; i < largeArray.length; i++) {}// 2. for...of(次快)
for (const item of largeArray) {}// 3. forEach(较慢)
largeArray.forEach(() => {});

⚠️ 实际性能差异在大多数场景下可忽略,优先考虑代码可读性!

http://www.xdnf.cn/news/12250.html

相关文章:

  • python基础day05
  • 【Hot 100】322. 零钱兑换
  • ABB 1MRK002247-Apr04保护继电器模块技术分析
  • 示波器电流探头校准规范指南
  • 操作系统中的设备管理,Linux下的I/O
  • mime嗅探的默认行为及Markdown文件响应格式
  • 小白升级的路-电子电路
  • Openldap 数据迁移后用户条目中 memberOf 反向属性丢失
  • 物料转运人形机器人适合应用于那些行业?解锁千行百业的智慧物流革命
  • 【Fiddler抓取手机数据包】
  • BT Panel密码修改
  • C语言| 指针引用数组元素
  • Windows上共享文件夹给Linux使用
  • 技术文档写作全攻略
  • 仿真每日一练 | Workbench手机后盖壳体类静力学分析
  • ROUGE评测指标深度解析
  • AD-线宽规则和过孔规则不生效
  • 在MATLAB中使用自定义的ROS2消息
  • MySQL中关于事务和锁的常见执行命令整理包括版本区别
  • Git Patch 使用详解:生成、应用与多提交合并导出
  • 炉石传说 第八次CCF-CSP计算机软件能力认证
  • 【大模型推理加速】MOE加速比与batchsize 关系
  • 某药监局药品详情sign值逆向
  • 第12期_网站搭建_几时网络验证1.3二改源码包2024 软件卡密系统 虚拟主机搭建笔记
  • linux下覆盖率测试总结
  • SQL Server相关的sql语句
  • React Hooks 指南:何时使用 useEffect ?
  • 鸿蒙APP测试实战:从HDC命令到专项测试
  • 【连接器专题】案例:FPC焊接金手指顶层和底层开窗/焊盘为什么要错位?
  • 《计算机是怎么跑起来的》第二章读后感