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

Web前端开发:JavaScript遍历方法详解与对比

1. 传统 for 循环

const arr = [10, 20, 30];
for (let i = 0; i < arr.length; i++) {console.log(`索引 ${i}: 值 ${arr[i]}`);
}
// 输出:
// 索引 0: 值 10
// 索引 1: 值 20
// 索引 2: 值 30
  • 特点:最基础的循环,可通过索引精准控制

  • 适用场景:需要索引操作、复杂循环控制(如break/continue

  • 注意:冗长但灵活性最高

2. for...of 循环 (ES6) 

const fruits = ['🍎', '🍌', '🍊'];
for (const fruit of fruits) {if (fruit === '🍌') break; // 支持中断console.log(fruit);
}
// 输出: 🍎
  • 特点:直接获取值(非索引),支持break/continue

  • 适用场景:数组、字符串、Map/Set等可迭代对象

  • 注意不能遍历普通对象(会报错)

3. for...in 循环 

const person = { name: 'Alice', age: 25 };
for (const key in person) {console.log(`${key}: ${person[key]}`);
}
// 输出:
// name: Alice
// age: 25
  • 特点:遍历对象键名(包括原型链上的可枚举属性)

  • 适用场景遍历对象属性,数组可用但不推荐(会遍历非数字键)

  • 注意:用hasOwnProperty过滤原型属性

 

4. forEach 方法 

[1, 2, 3].forEach((num, index) => {console.log(num * index); 
});
// 输出:0 (1*0), 2 (2*1), 6 (3*2)
  • 特点:数组专用,为每个元素执行回调

  • 适用场景:简单遍历数组,无需中断的场景

  • 注意无法用break中断,返回值始终为undefined

5. map 方法 

const nums = [1, 2, 3];
const squares = nums.map(num => num * num);
console.log(squares); // [1, 4, 9]
  • 特点:返回新数组(原数组不变),元素是一一映射的结果

  • 适用场景:数据转换(如 API 响应格式化)

  • 注意:回调必须return,否则新数组元素为undefined

 

6. filter 方法 

const numbers = [10, 15, 20, 25];
const bigNumbers = numbers.filter(num => num > 15);
console.log(bigNumbers); // [20, 25]
  • 特点:返回通过测试的元素组成的新数组

  • 适用场景:数据筛选(如过滤无效值)

  • 注意:不会修改原数组

🔑 核心区别总结表

方法主要用途返回值能否中断循环适用数据类型
for通用循环数组、字符串
for...of遍历可迭代对象的值数组、字符串、Map/Set
for...in遍历对象键名对象
forEach数组遍历undefined数组
map数组元素转换新数组数组
filter数组元素筛选新数组数组

 

💡 黄金实践建议

  1. 遍历数组

    • 需要索引 → for 或 forEach

    • 只需值 → for...of

    • 需返回新数组 → map/filter

  2. 遍历对象 → 只用 for...in (记得用obj.hasOwnProperty(key)过滤)

  3. 特殊需求

    • 需要中断循环 → for/for...of

    • 操作DOM集合 → 先用Array.from()转数组再用数组方法

⚠️ 避免用for...in遍历数组!它会遍历非数字键和原型链属性,导致意外行为。

http://www.lryc.cn/news/597569.html

相关文章:

  • 文字识别接口-文档识别技术-手写文字识别
  • VRRP的概念及应用场景
  • 字节 AI 编辑器 Trae 2.0 SOLO 出道! 国际版不充分指南及与国内版的对比
  • Python 程序设计讲义(8):Python 的基本数据类型——浮点数
  • day060-zabbix监控各种客户端
  • DPU 的基本运算单元是LUT吗?
  • 【笔记】wow-rag 第5课-流式部署
  • 进程间通信——POSIX 和 System V适用场景
  • c# sqlsuger 获取关联表中一个值
  • 插入的新节点非首节点
  • LLM 隐藏层特征增强技术
  • docker 离线安装postgres+postgis实践
  • Java TCP 通信详解:从基础到实战,彻底掌握面向连接的网络编程
  • Python-docx编号列表解析:从XML迷宫到结构化数据的破局之道
  • YOLOv5模型剪枝实战教程
  • 剪枝和N皇后在后端项目中的应用
  • Django 入门详解:从零开始构建你的第一个 Web 应用
  • 【C++】C++ 的入门知识2
  • 今日行情明日机会——20250723
  • 使用JMeter进行压力测试(以黑马点评为例、详细图解)
  • Flex布局与边距计算
  • 视频、音频录制
  • 使用Docker搭建SearXNG搜索引擎
  • 从0开始学习R语言--Day55--弹性网络
  • DIOR-ViT:用于病理图像癌症分类的差分序数学习视觉Transformer|文献速递-医学影像算法文献分享
  • 9、STM32的启动过程
  • VSCODE 禁用git 功能
  • Deep learning--模型压缩的五种方法
  • DenseNet详解,附模型代码(pytorch)
  • 扫描电镜与透射电镜联用表征形貌与元素组成-测试GO