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

news2025/1/21 22:00:20

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里面的异步任务结果。函数体外也可以。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/408496.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

VUE 年份范围选择器

VUE 年份范围选择器遇到一个需求,需要写一个年份选择器,是范围的年份选择器,比如:xxx年到xxx年 在使用elment UI的时候发现没有这种功能,于是采用el-date-picker 的年份选择器自己后封装了一个年份范围选择器 由于组件使用的地方很多,所以格式化都在组件中处理,回传格式在回传的…

Vue项目实战-vue2(移动端)

Vue项目实战(移动端)# 相关资料(一) 创建项目(二) 禁用Eslint(三) devtool(四) 添加less支持(五) vue路由配置(背诵)(六) 父子组件通信(背诵)(七) axios拦截器(背诵)(八) Sticky 粘性布局(九) 图片懒加载(十) 全局注册组件(十一) slot插槽(十二) 使用ui库需要关注的三点(十三)…

【Vue】Vue的安装

&#x1f3c6;今日学习目标&#xff1a;Vue3的安装 &#x1f603;创作者&#xff1a;颜颜yan_ ✨个人格言&#xff1a;生如芥子&#xff0c;心藏须弥 ⏰本期期数&#xff1a;第一期 &#x1f389;专栏系列&#xff1a;Vue3 文章目录前言Vue3安装独立版本CDN安装第一个Vue程序总…

vue递归组件—开发树形组件Tree--(构建树形菜单)

在 Vue 中&#xff0c;组件可以递归的调用本身&#xff0c;但是有一些条件&#xff1a; 该组件一定要有 name 属性要确保递归的调用有终止条件&#xff0c;防止内存溢出不知道大家有没遇到过这样的场景&#xff1a;渲染列表数据的时候&#xff0c;列表的子项还是列表。如果层级…

Vue基础--webpack介绍以及基础配置

写在最前&#xff1a;实际开发中需要自己配置webpack吗&#xff1f; 答案&#xff1a;不需要&#xff01; 实际开发中会使用命令行工具&#xff08;俗称CLI&#xff09;一键生成带有webpack的项目开箱即用&#xff0c;所有webpack的配置项都是现成的&#xff01;我们只需要知道…

python web开发基础

网站是存储在服务器上的文件&#xff0c;服务器是托管网站的计算机。这些服务器连接到一个称为 Internet 的网络。访问这些网站的计算机称为“客户端”。 要访问网站需要知道其IP地址&#xff0c;IP 地址是一串唯一的数字。每个设备都有一个 IP 地址。可以在控制台cmd输入命令…

前端笔记(10) Vue3 Router 监听路由参数变化

前言 Vue Router是开发Vue项目的必不可少的工具&#xff0c;也是极为重要的学习要点。 本篇介绍下Vue Router的基础使用和如何监听路由参数变化。 Vue Router入门 1 安装Router 安装Vue Router非常方便&#xff0c;只需执行一个命令&#xff0c;如果还不知道怎么搭建Vue项目…

详解 HttpServletResponse

详解 HttpServletResponse 核心方法代码示例1.设置响应状态码2.设置响应头3.设置响应内容&#xff08;1&#xff09;响应一个网页&#xff08;简单HTML&#xff09;&#xff08;2&#xff09;响应一个网页&#xff08;复杂HTML&#xff09;返回已有的一个网页1.重定向2.转发返回…

uniapp - 编译微信小程序项目的微信授权登录、获取微信手机号登录、最新版微信直接登录、手机与验证码登录的示例源码(适用于 uniapp 微信小程序项目,源代码直接开箱即用)超级详细的代码及注释

效果图 uniapp 项目编译微信小程序,一些常见的登录方式及源代码,示例代码干净整洁无BUG拿来即用。 本文示例实现了 uniapp 微信小程序项目的登录功能,包含微信授权登录、获取微信手机号登录、最新直接登录等, 你可以选择一个,直接复制源代码,稍微改改就能应用到你的项目…

后台管理系统

后台管理系统主要是我们内部人员使用的一款用来管理我们产品的一个系统&#xff0c;然后呢&#xff0c;我们今天写的呢是一个电商的后台管理系统。主要是可以用来管理我们的用户还有我们是商品的。 我们这个系统呢采用的是一个前后端分离的模式&#xff0c;主要是使用后端给我…

Vue 当页面进入全屏状态时element-ui的el-select下拉菜单不显示问题

在前两天进行页面全屏时&#xff0c;一切都还好好的&#xff0c;可当使用element-ui中的el-select时&#xff0c;下拉菜单却怎么也显示不出来&#xff0c;但只要退出全屏状态&#xff0c;立马就好。 非全屏时&#xff1a; 全屏时&#xff1a; 开始我以为是层级问题&#xff0…

前端加载高德离线地图的解决方案

核心是需要下载地图瓦片放在本地&#xff0c;脱离在线地图服务&#xff0c;实现离线加载地图。使用BIGMap工具下载地图离线瓦片到本地 下载地址&#xff1a;http://www.bigemap.com/reader/download/detail201802015.html BIGEMAP GIS Office-全能版需要注册试用版&#xff08;…

web前端面试宝典——带你直击面试重难点(40个经典题目,涵盖近90%的考点,码字2w,干货满满!)

系列文章目录 JavaScript 知识梳理&#xff0c;收录了web前端面试 95%以上 的高频考点&#xff0c;满满的干货。给你做一个高效的知识梳理&#xff0c;为你的面试保驾护航&#xff01; 内容参考链接HTML & CSS 篇HTML & CSS 篇JavaScript 篇&#xff08;一&#xff09;…

【微信小程序】条件渲染和列表渲染

&#x1f352;&#x1f352; 观众老爷们好啊&#xff0c;牛牛又更新了&#xff0c;上文我们详细了解了微信小程序中的事件绑定&#xff0c;那么今天我们就来讲讲WXML语法中的列表渲染和条件渲染&#xff0c;它俩也是非常重要的知识点&#xff0c;赶紧学起来吧。 &#x1f352;&…

如何更改ElementUI组件的图标大小以及标签属性

话不多说&#xff0c;直接上菜。 ElementUI提供的Rate评分组件的默认大小是这样的 图标太小了&#xff0c;想设置宽高、行高、尺寸&#xff0c;但代码不起作用。 打开浏览器调试&#xff0c;发现是用font-size设置才有用。 由此代码存在优先级问题&#xff0c;要提高优先级。…

vscode里面使用vue的一些插件,方便开发

1、vue 2 Snippets &#xff08;vue语法提示&#xff09; vue提示这个也可以 1.1 Vue VSCode Snippets 2、vetur Vetur支持.vue文件的语法高亮显示&#xff0c;除了支持template模板以外 3、Element UI Snippets(饿了么的提示) 4、indent-rainbow&#xff08;缩进高亮提示) 5…

Vue Element table表格实现表头自定义多类型动态筛选 , 目前10种筛选类型,复制即用

一、效果图 目前10种筛选类型 看看是否是你需要的&#xff0c;本文可能有点长 &#xff0c;我尽可能的给讲清楚&#xff0c;包括源码附上 二、无聊发言 点击当前行跳转部分数据后缀追加图标某列数据根据状态增加颜色标识 三、前言 实现图中的表格&#xff0c;特定的两个要求&…

css-两种画弧线方法

第一种&#xff1a;::after <template><view><view class"bg"></view></view> </template> <style> .bg{background-color: pink; } .bg::after{content: ;position: absolute;width: 160%;height: 100px;background: sk…

多项目版本管理:monorepo 策略

monorepo 是什么 一个产品会有多个项目&#xff0c;每个项目之间会存在版本同步的问题&#xff0c;如何在其中一个项目发布上线后&#xff0c;保证每个项目版本升级后的版本同步问题&#xff0c;提出的解决方案就是 monorepo 策略。 monorepo 是一种将多个项目代码存储在一个…

【小程序项目开发-- 京东商城】uni-app之商品列表页面 (上)

&#x1f935;‍♂️ 个人主页: 计算机魔术师 &#x1f468;‍&#x1f4bb; 作者简介&#xff1a;CSDN内容合伙人&#xff0c;全栈领域优质创作者。 该文章收录专栏 ✨ 2022微信小程序京东商城实战 ✨ 文章目录一、前言介绍二、创建goodlist 分支&#xff08;选读*)三、商品列…