JavaScript 中 for…of 循环遍历数组的正确姿势

javascript 中 for...of 循环遍历数组的正确姿势

本文旨在解决 JavaScript 中使用 for…of 循环遍历数组时遇到的 “is not iterable” 错误。我们将深入探讨 for…of 循环的工作原理,解释为何直接在数组上使用 for…of 循环可能导致错误,并提供多种正确的遍历数组的方法,包括使用 Array.entries() 获取索引和值,以及利用对象解构获取数组中对象的属性。同时,我们也会讨论不同遍历方式的性能差异,帮助开发者选择最适合的方案。

理解 for…of 循环

for…of 循环是 ES6 引入的一种新的循环语法,用于遍历可迭代对象(iterable objects)。可迭代对象是指实现了 Symbol.iterator 方法的对象,例如数组、字符串、Map、Set 等。for…of 循环每次迭代都会从可迭代对象中取出一个值,并将其赋值给循环变量。

问题所在

直接在数组上使用 for…of 循环,循环变量接收的是数组的元素值,而不是键值对。如果你尝试解构数组元素,期望得到键和值,就会出现 “is not iterable” 错误。这是因为数组元素本身不是一个可迭代对象。

立即学习“Java免费学习笔记(深入)”;

正确遍历数组的方法

使用 Array.entries() 获取索引和值

Array.entries() 方法返回一个包含数组索引和值的迭代器。我们可以使用 for…of 循环遍历这个迭代器,并使用数组解构来获取索引和值。

let collection = [    { name: 'music', views: 20 },    { name: 'abc', views: 32 },    { name: 'bob', views: 20 }];for (const [index, item] of collection.entries()) {    console.log(index, item); // 输出:0 { name: 'music', views: 20 } ...}

在这个例子中,collection.entries() 返回一个迭代器,每次迭代返回一个包含索引和值的数组。for…of 循环将这个数组解构为 index 和 item 两个变量。

使用对象解构获取数组中对象的属性

如果数组中的元素是对象,并且你只想访问对象的特定属性,可以使用对象解构。

let collection = [    { name: 'music', views: 20 },    { name: 'abc', views: 32 },    { name: 'bob', views: 20 }];for (const { name, views } of collection) {    console.log(name, views); // 输出:music 20 ...}

在这个例子中,for…of 循环遍历 collection 数组,每次迭代将数组元素(一个对象)解构为 name 和 views 两个变量。

使用 forEach 方法

forEach 方法是数组的一个内置方法,它接受一个回调函数作为参数,并对数组中的每个元素执行该回调函数。回调函数可以接收三个参数:元素值、索引和数组本身。

let collection = [    { name: 'music', views: 20 },    { name: 'abc', views: 32 },    { name: 'bob', views: 20 }];collection.forEach((item, index) => {    console.log(index, item); // 输出:0 { name: 'music', views: 20 } ...});

使用传统的 for 循环

传统的 for 循环仍然是一种有效的遍历数组的方式,尤其是在需要高性能的场景下。

let collection = [    { name: 'music', views: 20 },    { name: 'abc', views: 32 },    { name: 'bob', views: 20 }];for (let i = 0; i < collection.length; i++) {    console.log(i, collection[i]); // 输出:0 { name: 'music', views: 20 } ...}

性能考量

虽然 for…of 循环和 forEach 方法在语法上更简洁,但在处理大型数组时,传统的 for 循环通常具有更好的性能。这是因为 for…of 循环和 forEach 方法需要在每次迭代时调用函数,而传统的 for 循环可以直接访问数组元素。

根据一些基准测试,使用 Array.entries() 等迭代器的方式通常比 forEach 和 for…of 循环慢,而传统的 for 循环是最快的。

总结

在 JavaScript 中,使用 for…of 循环遍历数组时,需要注意循环变量接收的是数组元素的值,而不是键值对。如果需要访问数组的索引和值,可以使用 Array.entries() 方法。如果只需要访问数组中对象的特定属性,可以使用对象解构。在性能敏感的场景下,传统的 for 循环仍然是一种不错的选择。选择哪种方法取决于具体的需求和性能要求。

以上就是JavaScript 中 for…of 循环遍历数组的正确姿势的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1518300.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月20日 11:26:34
下一篇 2025年12月20日 11:26:49

相关推荐

  • JavaScript 中 for…of 循环迭代数组的正确姿势

    本文旨在解决 JavaScript 中使用 for…of 循环迭代数组时遇到的 “is not iterable” 错误。我们将深入探讨 for…of 循环的工作原理,并提供多种正确的迭代数组的方法,包括使用 Array.entries() 获取索引和…

    2025年12月20日
    000
  • JavaScript for…of循环与数组解构:深度解析与性能考量

    本文深入探讨了JavaScript中for…of循环在处理数组时,特别是与解构赋值结合使用时常见的误区。我们将详细解释为何直接对数组元素进行数组解构会导致错误,并提供两种正确且高效的解决方案:使用Array.prototype.entries()获取索引与值,以及利用对象解构直接访问数组…

    2025年12月20日
    000
  • 如何配置JS异地多活?

    异地多活通过CDN、多活源站、GeoDNS、客户端容错和CI/CD协同,实现JS应用跨区域高可用与低延迟,区别于传统灾备的“事后恢复”,其核心是“事前预防”与性能优化。 配置JavaScript应用的异地多活,核心在于构建一个能够跨地理区域提供服务、且在单个区域出现问题时能无缝切换的体系。这不仅仅是…

    2025年12月20日
    000
  • 在HTML的标签中多处显示变量值

    本文将介绍如何在HTML文档的 标签内的多个位置正确显示JavaScript变量的值。核心在于理解HTML中ID属性的唯一性,以及如何使用JavaScript有效地更新多个元素的内容。通过修改HTML结构和JavaScript代码,确保变量值在所有目标位置都能正确呈现。 在Web开发中,经常需要在H…

    2025年12月20日 好文分享
    000
  • 如何调试时区相关问题?

    答案是调试时区问题需系统性排查配置、代码与客户端。首先确认服务器、数据库及时区库设置正确,检查应用程序是否使用如pytz、java.time等库正确转换时区,避免手动计算偏移;其次通过日志、单元测试、调试器和抓包分析定位问题;确保时间存储采用UTC,传递后再转本地时区,并定期更新时区数据以应对夏令时…

    2025年12月20日
    000
  • 如何配置JS错误跟踪?

    配置JS错误跟踪需选择Sentry等服务,注册获取DSN,集成SDK并初始化,通过window.onerror和onunhandledrejection捕获全局错误与Promise拒绝,结合try…catch处理异常,配置Source Maps还原压缩代码错误位置,注意敏感数据过滤与采样…

    2025年12月20日
    000
  • 怎样使用Node.js操作枚举?

    Node.js无原生枚举,但可用Object.freeze()模拟或TypeScript实现。纯JS推荐const对象+Object.freeze()确保不可变,TS则提供编译时类型安全、自动补全与更好可维护性,大型项目建议用TS enum并集中管理定义。 Node.js本身在语言层面并没有内置像其…

    2025年12月20日
    000
  • 什么是JS的Map和Set?

    Map和Set是ES6引入的高效数据结构,Map支持任意类型键、保持插入顺序且性能更优,适用于动态键值对存储;Set确保值唯一,常用于数组去重和快速查找。WeakMap与WeakSet通过弱引用避免内存泄漏,适合关联对象元数据。 JavaScript中的 Map 和 Set ,简单来说,它们是ES6…

    2025年12月20日
    000
  • 什么是JS的闭包和作用域?

    闭包是函数与其词法作用域的组合,使函数能访问并记住其外部变量,即使在外部作用域外执行;作用域链决定变量查找路径,从当前作用域逐级向上至全局作用域;常见应用包括私有变量、函数工厂、事件处理,需注意内存泄漏和性能影响。 JavaScript的作用域(Scope)定义了代码中变量和函数的可访问性,它决定了…

    2025年12月20日
    000
  • 如何配置JS故障转移?

    JS故障转移通过冗余备份、异常监控与快速切换保障核心功能。配置多版本JS文件并部署于不同CDN,利用动态加载结合onerror和Promise超时机制检测加载失败,触发备用文件加载;通过Resource Timing API、错误监控平台等多维度监控,结合灰度发布、Feature Flags实现优雅…

    2025年12月20日
    000
  • 如何设置JS代码异常监控?

    答案:JS代码异常监控通过window.onerror、try…catch和unhandledrejection捕获错误,结合Source Map与上报服务实现错误收集;跨域需设置crossorigin和CORS;可模拟异常测试监控有效性。 JS代码异常监控,简单来说,就是捕获并记录Ja…

    2025年12月20日
    000
  • 如何调试打包大小问题?

    首先使用分析工具定位大文件,再通过资源压缩、代码拆分、依赖优化等手段减小打包体积。 调试打包大小问题,关键在于找到占用空间最多的部分,然后逐个优化。这通常涉及到资源优化、代码精简和配置调整。 解决方案: 分析打包文件: 使用工具分析打包后的文件,找出占用空间最大的资源和模块。例如,webpack-b…

    2025年12月20日
    000
  • Node.js中如何操作HTTP头?

    Node.js通过http/https模块操作HTTP头,使用request.headers读取请求头,response.setHeader或res.writeHead设置响应头,注意在发送响应前完成头设置,避免错误;可通过中间件统一处理头信息,如CORS、认证等,结合cookie模块处理Cooki…

    2025年12月20日
    000
  • 从 Mongoose 数组中移除对象的不同方法

    本文探讨了使用 Mongoose 从 MongoDB 文档的数组中删除特定对象的两种主要方法。第一种方法使用 $pull 操作符,它允许直接在数据库中执行删除操作,从而减少了数据库访问次数。第二种方法首先从数据库中检索文档,然后在内存中过滤数组,最后保存修改后的文档。我们将分析这两种方法的优缺点,并…

    2025年12月20日
    000
  • 使用 Mongoose 从数组中删除对象的最佳实践

    本文旨在探讨在使用 mongoose 从 mongodb 文档的数组字段中删除特定对象时,两种常见方法的优劣。我们将分析 $pull 操作符和 javascript 数组过滤方法,并推荐在不同场景下的最佳实践,以优化数据库操作效率。 在 Mongoose 中,从文档的数组字段中删除特定对象,通常有两…

    2025年12月20日
    000
  • Mongoose中从数组移除对象的两种方法对比与最佳实践

    本文对比了Mongoose中从文档数组中移除特定对象的两种常见方法:使用MongoDB的$pull操作符和先查询再内存过滤并保存。我们将深入探讨它们的实现方式、性能差异以及适用场景,并明确指出在大多数情况下,基于$pull操作符的方法因其高效性和原子性而成为更优选择。 在mongoose应用开发中,…

    2025年12月20日
    000
  • Mongoose中数组元素移除:$pull操作符与手动过滤的性能对比与最佳实践

    本文探讨了在Mongoose中从文档数组中移除特定对象的两种常见方法:使用MongoDB的$pull操作符和通过findById、内存过滤再save。通过对比它们的数据库访问次数和操作原子性,文章明确推荐使用$pull操作符,因为它能提供更高的效率和更好的数据一致性,避免了多次数据库交互带来的性能开…

    2025年12月20日
    000
  • 什么是JS的生成器函数?

    生成器函数通过function*定义,返回迭代器对象,调用next()可逐次执行并返回value和done属性,适用于异步编程、自定义迭代器等场景。 JS的生成器函数是一种特殊的函数,它允许你暂停函数的执行,并在稍后的某个时间点恢复执行。简单来说,它像一个可以多次返回值的函数。 生成器函数可以让你更…

    2025年12月20日
    000
  • Chakra UI Avatar 组件:安全优雅地显示用户姓名首字母缩写

    本教程将指导您如何在 Chakra UI 的 Avatar 组件中,安全且优雅地显示用户的姓名首字母缩写。我们将重点介绍如何利用 JavaScript 的模板字面量、可选链操作符以及条件渲染,构建健壮的字符串表达式,从而避免运行时错误,并确保在数据不完整时也能正常工作。 在现代前端应用中,用户头像(…

    2025年12月20日
    000
  • 什么是JS的实例化顺序?

    JavaScript的实例化顺序由代码执行顺序决定,对象在调用构造函数、使用new关键字或对象字面量等语句执行时即时创建,没有预设的统一实例化阶段。 JavaScript中并没有一个统一的、严格意义上的“实例化顺序”的概念,因为它是一种动态的、基于原型的语言。我们通常说的“实例化”指的是创建新对象的…

    2025年12月20日
    000

发表回复

登录后才能评论
关注微信