JS三种for遍历方法

devtools/2024/10/15 5:29:03/

在JavaScript中,for, forEach, 和 for...in 都是用来遍历集合的方法,但它们有不同的使用场景和特性。下面是详细的解释和比较:

1. for 循环

for 循环是最基本的循环结构,用于遍历数组或执行一组语句指定的次数。

语法
javascript">for (initialization; condition; finalExpression) {// loop body
}
示例
javascript">const array = [1, 2, 3, 4, 5];for (let i = 0; i < array.length; i++) {console.log(array[i]);
}
特点
  • 可以完全控制循环的开始、结束和每次迭代的步长。
  • 适用于任何类型的集合或需要精确控制迭代的情况。

2. forEach 方法

forEach 方法是数组对象的方法,用于对数组中的每个元素执行一次给定的函数。

语法
javascript">array.forEach(callback(currentValue, index, array) {// function body
});
示例
javascript">const array = [1, 2, 3, 4, 5];array.forEach(function(item, index) {console.log(item);
});
特点
  • 简洁明了,适用于数组。
  • 不支持提前终止循环(不能使用 breakcontinue)。
  • 不适合异步操作,因为它不会等待回调函数完成。

3. for...in 循环

for...in 循环用于遍历对象的可枚举属性,通常用于遍历对象的属性键。

语法
javascript">for (variable in object) {// loop body
}
示例
javascript">const object = { a: 1, b: 2, c: 3 };for (let key in object) {if (object.hasOwnProperty(key)) {console.log(key + ": " + object[key]);}
}
特点
  • 用于遍历对象的属性,而不是数组。
  • 可能会遍历对象的原型链上的属性,因此使用 hasOwnProperty 方法来过滤原型链上的属性。
  • 不推荐用于数组遍历,因为它遍历的是属性键而不是索引,且顺序不一定可靠。

总结

  • for 循环:适用于需要精确控制迭代的情况。可以用于数组和其他需要自定义迭代方式的集合。
  • forEach 方法:简洁明了,适用于遍历数组中的每个元素。不支持提前终止循环。
  • for...in 循环:用于遍历对象的可枚举属性。可以遍历对象的属性键,但不推荐用于数组遍历。

选择指南

  • 遍历数组:优先使用 for 循环或 forEach 方法。for 循环提供更多控制,forEach 方法更简洁。
  • 遍历对象:使用 for...in 循环,并结合 hasOwnProperty 方法来过滤原型链上的属性。

foreach详细解释

forEach 是 JavaScript 中 Array 对象的方法,用于对数组中的每个元素执行一次提供的函数。它简化了遍历数组的操作,使代码更简洁和易读。以下是关于 forEach 方法的详细解释,包括其语法、使用示例和注意事项。

语法

javascript">array.forEach(function(currentValue, index, array) {// function body
}, thisArg);
  • callback:在数组的每个元素上执行的函数。它接受三个参数:

    • currentValue:数组中正在处理的当前元素。
    • index(可选):数组中正在处理的当前元素的索引。
    • array(可选):被调用的数组。
  • thisArg(可选):可选的值,当执行回调函数时,用作 this 的值。

使用示例

简单的数组遍历
javascript">const array = [1, 2, 3, 4, 5];array.forEach(function(element) {console.log(element);
});// 输出:
// 1
// 2
// 3
// 4
// 5
使用索引
javascript">const array = ['a', 'b', 'c', 'd'];array.forEach(function(element, index) {console.log(`Element at index ${index} is ${element}`);
});// 输出:
// Element at index 0 is a
// Element at index 1 is b
// Element at index 2 is c
// Element at index 3 is d
使用 thisArg
javascript">const array = [1, 2, 3, 4, 5];const context = {multiplier: 2
};array.forEach(function(element) {console.log(element * this.multiplier);
}, context);// 输出:
// 2
// 4
// 6
// 8
// 10

注意事项

  1. 不能中断循环
    forEach 方法不能使用 breakcontinue 来中断循环。如果需要提前退出循环,应该使用 for 循环或 someevery 等方法。

  2. 不会返回新的数组
    map 方法不同,forEach 不会返回新的数组。它仅用于遍历数组并对每个元素执行操作。

  3. 异步操作
    如果回调函数中包含异步操作,forEach 不会等待异步操作完成。例如,forEach 中的 async 函数不会按预期方式等待。

    javascript">const array = [1, 2, 3, 4, 5];array.forEach(async function(element) {await new Promise(resolve => setTimeout(resolve, 1000));console.log(element);
    });// 输出顺序不确定,因为异步操作不会按预期方式等待
    

比较

for 循环 vs forEach
  • for 循环

    • 提供更多控制,如 breakcontinue
    • 可以提前退出循环。
    • 适用于任何类型的迭代。
  • forEach 方法

    • 简洁和易读。
    • 专门用于数组遍历。
    • 不支持提前退出循环。

总结

forEach 方法是遍历数组元素的简洁方法。它使得代码更简洁易读,但不能中断循环,也不会返回新的数组。如果需要在遍历过程中有更多控制(如提前退出循环),可以考虑使用 for 循环或其他迭代方法。


http://www.ppmy.cn/devtools/42668.html

相关文章

linux命令日常使用思考

linux命令日常使用思考 复制的相关问题scp和cp的区别root192.168.5.229-r的理解 更新版本的相关问题svn info 根目录和家目录的区别根目录家目录 复制的相关问题 scp和cp的区别 安全性&#xff1a;SCP 是基于 SSH 的加密传输协议&#xff0c;可以保证数据在传输过程中的安全性…

ArcGIS提取含有计曲线的等高线

喜欢就关注我们吧&#xff01; 今天我么来看看&#xff0c;如何利用DEM提取含有计曲线的等高线&#xff01; 常规的话我们利用DEM提取的等高线都是不带计曲线的&#xff0c;无法把计曲线标注出来&#xff0c;今天我们就来看下&#xff0c;如何处理一下哦&#xff01;提取带有计…

【计算机网络原理】对传输层TCP协议的重点知识的总结

˃͈꒵˂͈꒱ write in front ꒰˃͈꒵˂͈꒱ ʕ̯•͡˔•̯᷅ʔ大家好&#xff0c;我是xiaoxie.希望你看完之后,有不足之处请多多谅解&#xff0c;让我们一起共同进步૮₍❀ᴗ͈ . ᴗ͈ აxiaoxieʕ̯•͡˔•̯᷅ʔ—CSDN博客 本文由xiaoxieʕ̯•͡˔•̯᷅ʔ 原创 CSDN 如…

测试用例篇

测试用例的基本要素 **测试用例是为了实施测试而向被测试的系统提供的一组集合&#xff0c;这组集合包含&#xff1a;测试环 **境、操作步骤、测试数据、预期结果等要素.评价测试用例的标准&#xff1a;**对比好坏用例的评价标准 **用例表达清楚&#xff0c;无二义性用例可操作…

鸿蒙ArkUI-X跨平台技术:【开发准备】

开发准备 本文档适用于ArkUI跨平台应用开发的初学者。通过开发环境搭建、应用工程创建、编译和运行&#xff0c;熟悉ArkUI跨平台应用开发基本流程。 在开始之前&#xff0c;您需要了解有关跨平台应用的一些基本概念&#xff1a;ArkUI框架的简单说明、ArkUI-X的基本概念。 基…

关于Winform项目中DataGridView控件绑定list对象的坑

今天在使用DataGridView控件&#xff08;以下简称Dgv&#xff09;的时候&#xff0c;出现了"索引 -1 没有值。"的错误信息。 场景&#xff1a;我给Dgv绑定的数据源是一个List<MyClass>类型的集合&#xff0c;我new()完就直接给Dgv绑定了&#xff0c;然后在后面…

Flutter 中的 Material 小部件:全面指南

Flutter 中的 Material 小部件&#xff1a;全面指南 Flutter 的 Material 组件库提供了一套丰富的 UI 组件&#xff0c;用于构建遵循 Material Design 指南的应用。Material Design 是 Google 推出的一个设计语言&#xff0c;它旨在为 Android、Web、iOS 等多个平台提供统一的…

微服务架构下Docker容器技术与Kubernetes(K8S)

Kubernetes、微服务和Docker容器技术的结合提供了一个强大、灵活且高效的平台&#xff0c;能够应对现代应用程序的复杂性和动态性。Kubernetes的自动化管理、服务发现、负载均衡和配置管理&#xff0c;与Docker的标准化打包和运行环境相结合&#xff0c;最大化地发挥了微服务架…