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. linux 特殊符号(转)
  2. 开发者如何写好技术简历?
  3. python内置函数open的解释_在python的内置open()函数中缓冲的用途是什么?
  4. python显卡利用率_Linux和Windows查看当前运行的 python 进程及 GPU、磁盘利用率
  5. “滤镜景点”太坑遭吐槽!小红书致歉:将推出景区踩坑榜
  6. vs 警告被视为错误
  7. C语言OJ项目参考(2963) 判断三角形
  8. 自学python考哪些证书-【经验分享】想转行学python,过来人提醒大家几点
  9. pcie数据反_PCIe事务层の详解(一)
  10. python实现不使用额外空间去除重复元素
  11. java mysql 博客园_JAVA基础--MySQL
  12. 第四届“橙瓜网络文学奖”暨见证·网络文学20年评选分类型十佳大神网上投票震撼开启
  13. zencart bohase 模板
  14. graphpad prism怎么添加图例_Graphpad Prism 绘制散点图详细图解
  15. matlab multiply,MATLAB Matrix Multiply Code效率
  16. 如何构建JSON数据,JSON数据的格式,JSON数据的获取
  17. 治愈系插画PSD源文件+笔刷分享
  18. 谷歌学术 rss_如何自动将博客RSS供稿发布到Google plus页面?
  19. oracle迁移数据文件
  20. java 英语词汇、视频手把手地教你学习JAVA

热门文章

  1. 无心剑七绝147首[1994年~2021年]
  2. 第07篇 部署区块链浏览器(2)
  3. 简明GISer Python学习指南
  4. sklearn入门——聚类算法KMeans
  5. 网络对抗 Exp2.1 后门原理与实践 20154311 王卓然
  6. js:开启弹窗和关闭弹窗
  7. 《O2P卸甲笔记》附录:Oracle XE快速安装
  8. QT状态栏(statusbar)用法
  9. NS2的NODE类——node
  10. 制作html版圣诞礼物,10个圣诞礼物制作灵感 创意圣诞卡片手工制作