NodeJs - for循环的几种遍历方式

  • 一. for循环的几种遍历方式
    • 1.1 遍历的目标不一样
    • 1.2 空属性的遍历
    • 1.3 异步的调用
  • 二. 总结

一. for循环的几种遍历方式

我们先来看下for循环的4种不同遍历方式:

const arr = [10,20,30,40,50];for (let i = 0; i < arr.length; i++) {console.log(arr[i])
}arr.forEach((num,index)=> {console.log(num,index)
});for (const key in arr) {if (Object.hasOwnProperty.call(arr, key)) {console.log(arr[key])}
}for (const num of arr) {console.log(num)
}

接下来就从几个不同的方面来说下这四种打印方式的区别。

1.1 遍历的目标不一样

遍历的目标:

  • 普通的for循环:每层遍历需要通过下标来获取数组元素。
  • forEach:每层遍历可以直接拿到数组元素的值以及对应的下标
  • for-in:每层遍历需要根据数组对象的键,来获得对应的值
  • for-of:没层遍历可以直接拿到数组元素的值

我们来细说一下for-in方式,我们看下下面这段代码打印出什么东西。

// 数组就是一个对象
const arr = [10, 22, 33, 44, 55];
// 对象可以通过.xxx的方式直接赋值一个属性
// 如果是普通的数组元素,那么对应的key就是数组的下标。
for (const key in arr) {if (Object.hasOwnProperty.call(arr, key)) {console.log('Key: ' + key, ', Value: ' + arr[key])}
}

结果如下:

1.2 空属性的遍历

const arr = [10, , 55];
for (let i = 0; i < arr.length; i++) {console.log(arr[i])
}
console.log('*********************************************')
arr.forEach(num => {console.log(num)
});
console.log('*********************************************')
for (const key in arr) {if (Object.hasOwnProperty.call(arr, key)) {console.log(arr[key])}
}
console.log('*********************************************')
for (const num of arr) {console.log(num)
}

输出结果如下:

结论如下:

  • 会跳过空值:普通的for循环,for-of
  • 不会跳过空值: forEachfor-in

1.3 异步的调用

我们先来写个简单的异步函数:

async function asyncMethod(num) {setTimeout(() => {console.log('hello')}, 1000);return num
}

我们来看下下面的案例:

for循环调用案例:

const arr = [1, 2, 3];async function test() {const list = [];for (let i = 0; i < arr.length; i++) {const num = await asyncMethod(arr[i]);list.push(num);}console.log(list);return list;
}
{(async () => {await test();})()
}

结果如下:


forEach案例:

const arr = [1, 2, 3];async function test2() {const list = [];arr.forEach(async (num) => {const res = await asyncMethod(num);list.push(res);})console.log(list);return list;
}{(async () => {await test2();})()
}


for-in案例:

const arr = [1, 2, 3];async function test3() {const list = [];for (const key in arr) {const num = await asyncMethod(arr[key]);list.push(num);}console.log(list);return list;
}{(async () => {await test3();})()
}

结果如下:


for-of案例:

const arr = [1, 2, 3];async function test4() {const list = [];for (const num of arr) {const res = await asyncMethod(num);list.push(res);}console.log(list);return list;
}{(async () => {await test4();})()
}

结果如下:

可看出,只有forEach这种写法,在同一个异步函数体内,无法同步获取到异步结果。 意思就是:

async function test(){arr.forEach(async () => {const 异步任务结果= await 异步任务();})这里想拿到上面forEach循环里面做的异步结果是不行的doSomething()
}

但是,如果在函数题外面获取异步结果,例如:

async function test2() {const list = [];arr.forEach(async (num) => {const res = await asyncMethod(num);list.push(res);})return list;
}{(async () => {const list = await test2();console.log(list)})()
}

此时无论哪一种写法,都是能获取到完整的list的:

二. 总结

从遍历的目标来看:

  • for:通过数组下标获取元素。
  • forEach:可直接获取元素以及对应的下标。
  • for-in:通过数组的键获取对应的值。(value = arr.key
  • for-of:可直接获取元素。

从空属性的遍历来看:数组:arr = [1 , 2, ,3](注意有两个逗号)

  • for:跳过空值。
  • forEach:不会跳过空值,会打印出undefined
  • for-in:不会跳过空值,会打印出undefined
  • for-of:跳过空值。

从异步的结果的获取来看:

  • forEach无法在函数体内,获取forEach里面的异步任务结果。函数体外可以。

  • for:可以在函数体内,获取forEach里面的异步任务结果。函数体外也可以。

  • for-in:可以在函数体内,获取forEach里面的异步任务结果。函数体外也可以。

  • for-of:可以在函数体内,获取forEach里面的异步任务结果。函数体外也可以。

NodeJs - for循环的几种遍历方式相关推荐

  1. for 循环的三种遍历方式

    例如 都有个集合是product 第一种for循环 for(int i=0;i<=list.size();i++){ product pr=list.get(i); System.out.pri ...

  2. set的三种遍历方式-----不能用for循环遍历(无序)

    set的三种遍历方式,set遍历元素 list 遍历元素  http://blog.csdn.net/sunrainamazing/article/details/71577662  set遍历元素  ...

  3. Java基础知识 21(Set集合,HashSet集合以及它的三种遍历方式(迭代器,增强for循环,forEach),LinkedHashSet集合,TreeSet集合(自然排序法,比较器排序法))

    Java基础知识 21 Set集合 Set集合:一个不包含重复元素的Collection集合,元素不重复,List集合是允许元素重复的. Set接口的三个字类:HashSet(),LinkedHash ...

  4. HashMap 的 7 种遍历方式与性能分析!(强烈推荐)

    来自:Java中文社群 随着 JDK 1.8 Streams API 的发布,使得 HashMap 拥有了更多的遍历的方式,但应该选择那种遍历方式?反而成了一个问题. 本文先从 HashMap 的遍历 ...

  5. 二叉树总结—建树和4种遍历方式(递归非递归)

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/u013497151/article/details/27967155 今天总结一下二叉树.要考离散了 ...

  6. C++11 for区间遍历:vector几种遍历方式

    近来,基本上所有现代编程语言都有一种对一个区间写for循环的便捷方式.最终,C++也有了相同的概念:你可以给循环提供一个容器,它帮你迭代. example: #include <iostream ...

  7. HashMap 的 7 种遍历方式与性能分析!「修正篇」

    这是我的第 57 篇原创文章 首先,给大家说声抱歉~ 事情经过是这样子的,五一节前我发布了一篇文章<HashMap 的 7 种遍历方式与性能分析!>,但是好心的网友却发现了一个问题,他说 ...

  8. HashMap 的 7 种遍历方式与性能分析!

    随着 JDK 1.8 Streams API 的发布,使得 HashMap 拥有了更多的遍历的方式,但应该选择那种遍历方式?反而成了一个问题. 本文先从 HashMap 的遍历方法讲起,然后再从性能. ...

  9. HashMap 的 7 种遍历方式+性能分析!

    随着 JDK 1.8 Streams API 的发布,使得 HashMap 拥有了更多的遍历的方式,但应该选择那种遍历方式?反而成了一个问题. 本文先从 HashMap 的遍历方法讲起,然后再从性能. ...

最新文章

  1. nginx不同server不同日志文件_招标里的答疑是什么?和澄清文件有何不同?
  2. 构建安全的 ASP.NET 应用程序
  3. [转]关于MyEclipse下的项目无法使用BASE64Encoder问题的解决办法
  4. 使用TreadPool时的ThreadLocal示例
  5. DATE_FORMAT() 函数||DATE_SUB() 函数
  6. python matplotlib模块——绘制三维图形、三维数据散点图
  7. rfc3095中文版_RFC3095
  8. Log4j配置文件以及配置方法
  9. maven web项目导入sts_Spring Boot2 系列教程(二)创建 Spring Boot 项目的三种方式
  10. 实时计算pv/uv Demo
  11. 在微型计算机系统中,打印机一般是通过( ,2013湖南省计算机等级考试试题 二级C试题最新考试试题库...
  12. 在java中null的作用_在java中避免使用!= null有什么好处?
  13. 如何保证高可用?java删除文件夹下所有文件,技术详细介绍
  14. 我的敏捷、需求分析、UML、软件设计电子书 - 下载(持续更新中)
  15. 语法比较:Julia,Matlab,Python
  16. java算法面试题_Java算法面试题汇总
  17. UE4特效萌新上手笔记-Houdini导Niagara配置
  18. 解析信号与希尔伯特变换
  19. win10系统计算机物理地址,win10系统查看网卡的物理地址的操作方法
  20. 微信生成带参数二维码以及获取此二维码参数

热门文章

  1. 光武1号守卫盾,一款让优秀非凡的重疾产品【保通保险】
  2. jkd1.8 list.stream()练习
  3. 指定定时任务,可改变任务定时时间
  4. 谁能最后享受到胜利成果?
  5. 使用ERP系统管理生产订单的具体流程
  6. 基于百度翻译和有道翻译api的一款翻译Demo
  7. 使用simulink进行stm32开发1
  8. Linux proxy 设置
  9. 教小白使用Vmware安装苹果虚拟机
  10. 计算机网络概述(上)