”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 理解 JavaScript 数组迭代方法

理解 JavaScript 数组迭代方法

发布于2024-11-08
浏览:469

Understanding JavaScript Array Iteration Methods

我最近遇到一个面试问题,要求使用不同的方法来迭代 JavaScript 数组对象。提示最初看起来很简单,因为我需要提供一些示例代码片段。然而,这个问题引起了我的兴趣,所以我决定更深入地研究每种方法,不仅探索如何使用它们,而且探索何时以及为何选择一种方法而不是另一种方法。

在本文中,我将引导您了解在 JavaScript 中迭代数组的各种方法,重点介绍它们的差异、优点和用例。

for 循环
优点

  • 灵活性:for 循环通过允许使用break 退出循环或继续跳到下一次迭代来提供灵活性。您还可以直接指定索引,从而精确控制循环的行为。
  • 非顺序顺序:您可以通过调整循环条件来控制迭代顺序,例如向后迭代或跳过某些元素。

在引入 for...of 循环之前,传统的 for 循环是数组迭代的标准方法。然而,它很容易出现错误,例如从 1 而不是 0 开始索引,或者错误地使用 arr.length 而不是 arr.length - 1。正如 MDN 所建议的,“通常最好用于...如果可以的话。"

何时使用
当您需要完全控制迭代时,例如跳过迭代或反向迭代。
当您在迭代过程中同时需要索引和值时。

为...的
优点

  • 简单性和建议:for...of 循环是一种简单且推荐的迭代数组的方法,因为它会自动为您处理索引。您仍然可以根据值而不是索引使用break退出循环或继续跳到下一次迭代。

何时使用
当您只需要使用值而不需要访问索引时。

Array.prototype.map()
优点

  • Non-mutating:原始数组保持不变。
  • 返回一个新数组:将指定的函数应用于每个元素后,map() 返回一个包含结果的新数组。这使得它非常适合函数式编程。

何时使用
当您想要将函数应用于数组的每个元素并需要将结果作为新数组时。

Array.prototype.forEach()
优点

  • 无返回值:forEach() 允许您对每个元素执行函数而不返回新数组。它通常用于执行副作用,例如记录日志、更新变量或操作 DOM。

何时使用
当您想要将函数应用于数组的每个元素但不需要返回新数组时。

Array.prototype.entries()
优点

  • 访问索引和值:entries() 返回一个迭代器,该迭代器提供每个元素的索引和值。这比使用传统的 for 循环更简单且更具可读性。如果数组槽为空,则返回值未定义。

何时使用
当您需要访问数组元素的索引和值时。

Array.prototype.keys()
优点

  • 访问索引:keys() 返回数组索引的迭代器。当您只需要索引而不需要值时,这非常有用。在稀疏数组中,[...arr.keys()] 还将包含空槽的索引(其中值未定义)。

何时使用
当您需要一个仅提供数组元素索引的迭代器时。

Array.prototype.values()
优点

  • 访问值:values() 返回数组值的迭代器。这类似于对数组使用 for...of,但提供迭代器而不是循环。

何时使用
当您需要一个仅提供数组元素值的迭代器时。

什么是数组迭代器:
Array.prototype.entries()、Array.prototype.keys() 和 Array.prototype.values() 返回新的数组迭代器对象。这些迭代器允许您一次遍历一个类似数组的集合中的一个元素。它们带有 next() 方法,该方法提供序列中的下一个值,可以根据需要调用该方法,从而有助于节省内存。

这是一个使用entries()的例子:

const arr = ['a', 'b', 'c'];
const iterator = arr.entries();

console.log(iterator.next()); // { value: [0, 'a'], done: false }
console.log(iterator.next()); // { value: [1, 'b'], done: false }
console.log(iterator.next()); // { value: [2, 'c'], done: false }
console.log(iterator.next()); // { value: undefined, done: true }

说实话,我并没有完全了解这些方法的一些细节和用途,所以解决这个面试问题并加深我的理解非常重要。无论您使用的是基本循环还是更高级的函数式编程技术,了解这些方法都可以显着提高代码的效率和可读性。

版本声明 本文转载于:https://dev.to/ayako_yk/understanding-javascript-array-iteration-methods-8e?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • Java中如何使用观察者模式实现自定义事件?
    Java中如何使用观察者模式实现自定义事件?
    在Java 中创建自定义事件的自定义事件在许多编程场景中都是无关紧要的,使组件能够基于特定的触发器相互通信。本文旨在解决以下内容:问题语句我们如何在Java中实现自定义事件以促进基于特定事件的对象之间的交互,定义了管理订阅者的类界面。以下代码片段演示了如何使用观察者模式创建自定义事件: args)...
    编程 发布于2025-05-17
  • 如何在GO编译器中自定义编译优化?
    如何在GO编译器中自定义编译优化?
    在GO编译器中自定义编译优化 GO中的默认编译过程遵循特定的优化策略。 However, users may need to adjust these optimizations for specific requirements.Optimization Control in Go Compi...
    编程 发布于2025-05-17
  • 如何从Python中的字符串中删除表情符号:固定常见错误的初学者指南?
    如何从Python中的字符串中删除表情符号:固定常见错误的初学者指南?
    从python import codecs import codecs import codecs 导入 text = codecs.decode('这狗\ u0001f602'.encode('utf-8'),'utf-8') 印刷(文字)#带有...
    编程 发布于2025-05-17
  • 为什么不````''{margin:0; }`始终删除CSS中的最高边距?
    为什么不````''{margin:0; }`始终删除CSS中的最高边距?
    在CSS 问题:不正确的代码: 全球范围将所有余量重置为零,如提供的代码所建议的,可能会导致意外的副作用。解决特定的保证金问题是更建议的。 例如,在提供的示例中,将以下代码添加到CSS中,将解决余量问题: body H1 { 保证金顶:-40px; } 此方法更精确,避免了由全局保证金重置引...
    编程 发布于2025-05-17
  • Python中何时用"try"而非"if"检测变量值?
    Python中何时用"try"而非"if"检测变量值?
    使用“ try“ vs.” if”来测试python 在python中的变量值,在某些情况下,您可能需要在处理之前检查变量是否具有值。在使用“如果”或“ try”构建体之间决定。“ if” constructs result = function() 如果结果: 对于结果: ...
    编程 发布于2025-05-17
  • 为什么我会收到MySQL错误#1089:错误的前缀密钥?
    为什么我会收到MySQL错误#1089:错误的前缀密钥?
    mySQL错误#1089:错误的前缀键错误descript [#1089-不正确的前缀键在尝试在表中创建一个prefix键时会出现。前缀键旨在索引字符串列的特定前缀长度长度,可以更快地搜索这些前缀。了解prefix keys `这将在整个Movie_ID列上创建标准主键。主密钥对于唯一识别...
    编程 发布于2025-05-17
  • \“(1)vs.(;;):编译器优化是否消除了性能差异?\”
    \“(1)vs.(;;):编译器优化是否消除了性能差异?\”
    答案: 在大多数现代编译器中,while(1)和(1)和(;;)之间没有性能差异。编译器: perl: 1 输入 - > 2 2 NextState(Main 2 -E:1)V-> 3 9 Leaveloop VK/2-> A 3 toterloop(next-> 8 last-> 9 ...
    编程 发布于2025-05-17
  • Java数组中元素位置查找技巧
    Java数组中元素位置查找技巧
    在Java数组中检索元素的位置 利用Java的反射API将数组转换为列表中,允许您使用indexof方法。 (primitives)(链接到Mishax的解决方案) 用于排序阵列的数组此方法此方法返回元素的索引,如果发现了元素的索引,或一个负值,指示应放置元素的插入点。
    编程 发布于2025-05-17
  • 为什么尽管有效代码,为什么在PHP中捕获输入?
    为什么尽管有效代码,为什么在PHP中捕获输入?
    在php ;?>" method="post">The intention is to capture the input from the text box and display it when the submit button is clicked.但是,输出...
    编程 发布于2025-05-17
  • 如何在无序集合中为元组实现通用哈希功能?
    如何在无序集合中为元组实现通用哈希功能?
    在未订购的集合中的元素要纠正此问题,一种方法是手动为特定元组类型定义哈希函数,例如: template template template 。 struct std :: hash { size_t operator()(std :: tuple const&tuple)const {...
    编程 发布于2025-05-17
  • 如何干净地删除匿名JavaScript事件处理程序?
    如何干净地删除匿名JavaScript事件处理程序?
    删除匿名事件侦听器将匿名事件侦听器添加到元素中会提供灵活性和简单性,但是当要删除它们时,可以构成挑战,而无需替换元素本身就可以替换一个问题。 element? element.addeventlistener(event,function(){/在这里工作/},false); 要解决此问题,请考虑...
    编程 发布于2025-05-17
  • 左连接为何在右表WHERE子句过滤时像内连接?
    左连接为何在右表WHERE子句过滤时像内连接?
    左JOIN CONUNDRUM:WITCHING小时在数据库Wizard的领域中变成内在的加入很有趣,当将c.foobar条件放置在上面的Where子句中时,据说左联接似乎会转换为内部连接。仅当满足A.Foo和C.Foobar标准时,才会返回结果。为什么要变形?关键在于其中的子句。当左联接的右侧值...
    编程 发布于2025-05-17
  • 如何使用Python的请求和假用户代理绕过网站块?
    如何使用Python的请求和假用户代理绕过网站块?
    如何使用Python的请求模拟浏览器行为,以及伪造的用户代理提供了一个用户 - 代理标头一个有效方法是提供有效的用户式header,以提供有效的用户 - 设置,该标题可以通过browser和Acterner Systems the equestersystermery和操作系统。通过模仿像Chro...
    编程 发布于2025-05-17
  • Java开发者如何保护数据库凭证免受反编译?
    Java开发者如何保护数据库凭证免受反编译?
    在java 在单独的配置文件保护数据库凭证的最有效方法中存储凭据是将它们存储在单独的配置文件中。该文件可以在运行时加载,从而使登录数据从编译的二进制文件中远离。使用prevereness class import java.util.prefs.preferences; 公共类示例{ 首选项...
    编程 发布于2025-05-17
  • `console.log`显示修改后对象值异常的原因
    `console.log`显示修改后对象值异常的原因
    foo = [{id:1},{id:2},{id:3},{id:4},{id:id:5},],]; console.log('foo1',foo,foo.length); foo.splice(2,1); console.log('foo2', foo, foo....
    编程 发布于2025-05-17

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3