Javascript学习之路:js中关于遍历总结

在这里插入图片描述

循环/遍历

  • 循环,就是一遍又一遍的重复执行相同或者相似的代码
  • 循环结构的两个要素
    • 循环体–要执行的相同或相似的语句
    • 循环条件–重复执行的次数,或者继续执行循环的条件

👉while循环

  • while循环语法格式

    
     while(boolean表达式){
         循环体语句
     }
     
     // 若boolean表达式为true,则执行一遍循环体中的语句,然后再判定一次boolean表达式,若为true,则再次执行一遍循环体中的语句,直到boolean表达式的值为false,则循环结束。
     
     while(isHungury){
         eatSomething()
     }
     
     // 需要注意的是,一般情况下,循环操作中会存在使得循环终止的可能性,否则将成为死循环
    
  • 案例1

    
    // 打印1~10
    var i=1; //初始值
    while(i<=10){//循环条件
        //循环体
        console.log(i);
       i++; //增量
    }
    console.log('当循环结束的时候,i的值是'+i)//拼接
    
    
  • 案例2

    
    // 循环打印70 65 60 55 50
    var i=70
    while (i>=50)
    {
        console.log(i);
        i-=5;
    }
    
    
  • 案例3

    //打印1-100之间所有的奇数
    var i=1;
    while(i<=100){
        //奇数
       if(i%2===1){
      	  console.log(i);
        }
        i++;}
        
        
    //计算1-100之间所有整数的和
    var i=1;
    var sum=0;//用于记录和
    while (i<=100)
    {
    //把每次产生的值加到sum
    sum+=i
    //console.log(sum);
      i++
    }
     //打印sum最终的结果
    console.log(sum);
    
    
    //计算1-100之间所有偶数的和
    var i=1;
    var sum=0;
    while(i<=100){
        if(i%2===0){
      	  //加到一起
      	  sum+=i;
        }
        i++;
    }
    console.log(sum);
        
    

👉do-while循环

  • do-while循环语法格式

    do{
        可执行的语句;  // 无论循环条件是否满足,循环体至少执行一遍
    }while(boolean表达式)
    
    // 先执行一次循环体中的语句,然后判定boolean表达式的值,若为true,则继续执行循环体中的语句;然后再继续判定boolean表达式的值...直到boolean表达式的值为false退出
    
    do{
        eatSomething()
    }while(isHungry)
    
  • 案例1

    
    // 打印30-50之间的所有整数
    var i=30;
    do
    {
        console.log(i);
        i++
    }while (i<51);
    
  • 案例2

    // 打印1-100的所有奇数
    var i=1;
    do
    { //判断是否为奇数
        if(i%2===1){
        console.log(i);
        }
        i++
    }while (i<=100);
     
    
  • 案例3

    //计算1~100之间所有能被7整除的数字的和
    var i=1;
    var sum=0;
    do
     {
          if(i%7===0){
            sum+=i;
          }
         i++;
     }while (i<=100);
     console.log(sum);
     
     //计算1~20之间所有能被3整除的数字的乘积
     var i =1;
     var s=1;
     do
     {
         if(i%3===0){
            s*=i;
         }
            i++;
     }while (i<=20);
     console.log(s);
    

while和do-while语句的区别

  1. while循环,先判断再执行
  2. do-while循环,先执行再判断,例如ATM机输密码
  3. 当初始情况不满足循环条件时,while循环一次都不会执行;do-while循环不管任何情况都至少执行一次。

//ATM机输密码,先输密码再判断对错。
//使用while循环
var upwd=123456;
while(true){
    varstr=prompt('请输入密码')if(str===upwd){
        break;
    }
}
//使用do-while循环
var upwd=123456;
do
{
    varstr=prompt('请输入密码');//输入密码
}
while ( str!=upwd);

👉for语句

  • for循环的语法格式

    
    //  初始值  循环条件  增量 
    for(表达式1;表达式2;表达式3){
        循环体语句
    } 
    
    
  • for循环执行过程

    • 计算表达式1的值

    • 计算表达式2(boolean表达式)的值,如果为true则执行循环体,否则退出循环

    • 执行循环体

    • 执行表达式3

    • 计算表达式2;如果为true则执行循环体,否则退出循环

    • 如此循环往复,直到表达式2的值为false

    • 案例

    
    //1-50之间所有能被3整除
    for (var i=1;i<=50;i++ )
    {
        if(i%3===0){
            console.log(i);
        }
    }
    
    //计算101-200之间所有的偶数和
    for (var i=101,sum=0;i<=200;i++)
    {
        if(i%2==0){
            sum+=i;
        }
    }
    console.log(sum);
    
    //打印本世纪所有闰年
    for (var i=2000;i<2100;i++ )
    {
        if(i%4===0 && i%100 !==0||i%400===0){
            console.log(i);
        }
    }
    
    //九九乘法表的第五行
    //1*5= 5  ,2*5=10  ,3*5=15 ,4*5=20  ,5*5=25
    for(var i=1,str='';i<=5;i++){
                                     //str+=i; //1 2 34 5在一行
        str+=i+'*5='+i*5+'   ';      //字符串的拼接
    }
    console.log(str);
    
    
  • for语句三个表达式特殊用法

    • 表达式1位置内容为空

      var sum=0;
      var i=1;
      for(;i<=100;i++){
      	sum+=i;
      }
      console.log('1-100的和为:',sum) //1-100的和为: 5050
      
    • 表达式3的位置内容为空时

      var sum=0;
      for(var i=1;i<=100;){
      	sum+=i;
      	i++;
      }
      console.log('1-100的和为:',sum) //1-100的和为: 5050
      
    • 表达式1,2,3位置内容均为空时

      for(;;){
      	console.log('我要读书...') //死循环
      }
      
  • 循环中使用break语句

    • break用于循环,可使程序终止循环而执行循环后面的语句,常常与条件语句一起使用
    
       var sum=0
       for(var i=0;i<=100;i++){
      	 if(sum>=4000){
      		 break
      	 }
      	 sum+=i
       }
       // 当总和大于等于4000时,退出循环
    
    
  • 循环中使用continue 语句

    • continue关键字只用于循环中
    • 其作用为跳过本次循环体中剩余语句而执行下一次循环
    
      //打印1-10之间所有整数,不包含5
      for(var i=1;i<=10;i++){
          //当i为5,跳过后续语句
         if(i===5){
              continue;
          }
          console.log(i);
      }
      
      //计算1-100之间所有偶数的和,遇到奇数跳过
      for (var i=1,sum=0;i<=100;i++){
      //如果i为奇数,跳过
      if(i%2===1){
      	continue;
      	}
      	sum+=i;
      }
      console.log(sum);
      
    
  • 循环嵌套(一)

    • 需要多次重复执行一个或多个任务的问题考虑使用循环来解决

    • for/while/do-while三种循环在很多情况下是可以互换的;一般情况下,for循环使用最多

    • 案例1

        //*****
        for (var i=1,str='';i<=5;i++)
        {
        str+='*';
        }
        console.log(str);
      
      
        //*****
        //*****
        //*****
        //*****
        //*****
        for (var j=1;j<=5;j++ )
        {
            for(var i=1,str='';i<=5;i++)
        {
        str+='*';
        }
        console.log(str);
        }
        //外层:循环行
        //内层:循环列
      
    • 案例2

      //*    1 1
      //**   2  2
      //***  3 3
      //**** 4 4
      //***** 5 5
      for (var j=1;j<=5;j++ )
      {
          for(var i=1,str='';i<=j;i++)  //str写在内层,表示每循环一层把之前一层清空   
                                          str 写在外层,表示每循环一层把之前一层加上
      {
      str+='*';
      }
      console.log(str);
      }
      //外层:循环行
      //内层:循环列
      
    • 案例3

      //打印九九乘法表 (外层是九行
      /*
      1*1=1
      1*2=2   2*2=4
      1*3=3   2*3=6  3*3=9
      */
      //外层循环
      for(var i=1;i<=9;i++){
          //内层循环
        for(var j=1 str='';j<=i;j++){
              str+=j+'*'+i+'='+(j*i)+'';
        }
          console.log(str);
      }
      
    • 案例4

      //打印本世纪前10个闰年
      for (vari=2000,count=0;i<=2100;i++)
      {
          if(i%4===0 && i%100!==0 ||i%400===0 ){
              console.log(i);
              //如果i为闰年
              count++;
              //每次有一个闰年产生,判断是否为10
              if(count===10){
                  break;
              }
          }
      }
      console.log(count);
      
  • 循环嵌套(二)

    • 案例1

      for(var i=0,j=8;i<=5;i++,j--){
        console.log(i,j)
      }
      
    • 案例2

      // 多个条件表达式后边的起作用
      for(i=1,j=8;j>=1,i<=5;i++,j--){
        console.log(i,j)
      }
      
      for(var i=1,j=8;i<=5,j>=1;i++,j--){
        console.log(i,j)
      }
      
    • 案例3

      //计算1/20+2/18+.....10/2
      for(vari=1,j=20,sum=0;i<=10;i++,j-=2){
          sum+=i/j;
      }
      console.log(sum);
      

👉for in

  • 用于遍历对象
  • 只有对象才会关注原型上的方法,而遍历数组更多的是关注遍历数组里面的值,而不是关注原型。
  • for in会把原型上的东西都给遍历出来,只是数组都加了隐藏的属性,所以看不出来。

👉for of (es6)

  • 遍历具有可迭代协议([Symbol.iterator] 属性)的对象(Array Map Set string 类数组)
  • 迭代器的语法糖,循环出的item是next返回对象里的value值

// 迭代完成后循环结束
for(const item of iterable){
	 // iterable:可迭代对象
	 // item 每次迭代得到的数据
}

👉forEach()

  • forEach(fun)专门用于对原数组中每个元素执行相同的fun函数对象规定的操作

  • forEach(function(elem,i,arr){})

    • elem 数组中的每一个值
    • i 每一个下标
    • arr 数组本身

【面试题】:forEach能否取代for循环

  • 不能,forEach不支持continue和break
  • forEach的优势就是,它传入一个回调函数,因此形成一个作用域,它内部所定义的变量不会像for循环一样污染全局变量。
  • forEach本身无法跳出循环,必须遍历所有的数据才会结束

👉every()

  • every(fun) 判断数组中每一个元素是否都满足fun函数定义的条件,只有满足才返回true,否则返回false

  • every(function(elem,i,arr){ return xxx})

    • every中自带for循环,自动遍历数组中每个元素
    • 每遍历一个元素,就会自动调用回调函数
    • 如果回调函数返回true,则有必要继续判断下一个
    • 如果回调函数返回false,则没必要继续判断下一个,而是退出函数,直接返回false,表示不是所有元素都符合要求
    • 如果程序可以正常执行完循环,说明数组中所有元素都符合要求,才能返回true
    • 如果回调函数没有返回值,则every会悄悄得添加一个返回值为false
    • every得遍历见到false就停止
    • 回调函数得返回值如何设置
      • 返回值应该为筛选条件–>看数组中得值是否满足条件
        • 不满足条件,直接返回false,遍历停止
        • 满足条件,遍历继续,都满足,返回true。

👉some(func)

  • some(function(elem,i,arr){ return xxx})判断数组中是否包含满足fun函数定义得条件得元素。只要包含返回true,否则返回false
  • 如果回调函数没有返回值.则some会悄悄得添加一个返回值为false
  • some 的遍历见到false就继续,见到true才停止。
  • 返回值应该为筛选条件->看数组中的值是否都满足条件
  • 满足条件,直接返回true,遍历停止
  • 值不满足条件,继续遍历,如都不满足,返回false

👉filter(func)

  • filter(function(elem,i,arr){ return xxx}) 专门用于筛选出数组中符合fun函数判断条件得新数组

👉map(func)

  • map(function(elem,i,arr){ return xxx}) 专门用于基于原数组创建新数组对象

  • 对数组中的每一个值做操作 并把操作后的值汇成一个新数组

    var newArr=arr.map((val)=>{
        return val+2
    });
    console.log(newArr);
    
  • map()和forEach()的区别: 前者不改变原数组的内容,后者改变原数组的内容

👉reduce(func)

  • reduce((prev,elem,i,arr)=>{ return prev+elem})reduce()和reduceRight()方法会迭代数组中的每一个元素,汇总出和一个最终结果值返回

👉 find(func) 查找数组中符合指定条件的第一个元素,并返回该元素

const result = array.find((element, index, array) => {
  // 返回一个条件,用于查找符合条件的元素
	
	// element:当前遍历到的数组元素
	// index:遍历到所有数组元素的索引
	// array:调用 find 的数组本身
})

// 例
const numbers = [1, 2, 3, 4, 5];
const result = numbers.find((element) => {
  return element >= 3;
});
console.log(result); // 输出: 3

👉【扩展1】 for和forEach跳出循环的方法

  • for循环跳出循环

    • break 跳出循环
    • continue 跳出当次循环
    • return 终止当前函数的执行
    var arr = [1,3,5,7,9];
    var id = 5;
    for (var i = 0; i < arr.length; i++) {
        if(arr[i]=== 1) continue;    //跳过当次循环
        console.log(arr[i])
        if (arr[i] === id) {    
            break;                   //满足条件,跳出循环
        }
        if (arr[i] === 6) {
            return;              //满足条件,可以终止当前函数
        }
    }
    
  • forEach跳出循环

    • 通过抛出异常的方式跳出循环,return 跳出当次循环

      var arr = [1,3,5,7,9];
      var id = 5;
      try {
          arr.forEach(function (curItem, i) {
              if(curItem === 1) return;
              console.log(curItem)
              if (curItem === id) {
                  throw Error();         //满足条件,跳出循环
                        
              }
          })
      } catch (e) {
      }
      
      arr.forEach(function (curItem, i) {
       if(curItem === 1) return;
       console.log(curItem)
       if (curItem === id) {
           return;         //满足条件,跳出当次循环
           // break 语法报错;
                
       }
       })
      

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数据库选型实践:如何避开分库分表痛点 | OceanBase用户实践

随着企业业务的不断发展&#xff0c;数据量往往呈现出快速的增长趋势。使用MySQL的用户面对这种增长&#xff0c;普遍选择采用分库分表技术作为应对方案。然而&#xff0c;这一方案常在后期会遇到很多痛点。 分库分表的痛点 痛点 1&#xff1a;难以保证数据一致性。由于分库分…

算法之分治

分而治之 分治法所能解决的问题一般具有以下几个特征&#xff1a; 1) 该问题的规模缩小到一定的程度就可以容易地解决 2) 该问题可以分解为若干个规模较小的子问题&#xff0c;即该问题具有最优子结构性质 3) 利用该问题分解出的子问题的解可以合并为该问题的解 4) 该问题所分…

Redis在互联网大厂中的应用案例分析

携程金融的Redis架构 携程金融在经过多年的演进后,形成了多层次的系统架构,其中基础数据(如用户信息、产品信息、订单信息等)由底层系统产生,并服务于所有的金融系统。这些基础数据通过统一的缓存服务(系统名utag)进行缓存。缓存数据具有全量、准实时、永久有效的特点,…

【SpringBoot + Vue 尚庭公寓实战】标签和配套管理接口实现接口实现(六)

【SpringBoot Vue 尚庭公寓实战】标签和配套管理接口实现接口实现&#xff08;六&#xff09; 文章目录 【SpringBoot Vue 尚庭公寓实战】标签和配套管理接口实现接口实现&#xff08;六&#xff09;1、保存或更新标签信息2、根据id删除标签信息3、根据类型查询配套列表4、新…

【机器学习】基于CNN-RNN模型的验证码图片识别

1. 引言 1.1. OCR技术研究的背景 1.1.1. OCR技术能够提升互联网体验 随着互联网应用的广泛普及&#xff0c;用户在日常操作中频繁遇到需要输入验证码的场景&#xff0c;无论是在登录、注册、支付还是其他敏感操作中&#xff0c;验证码都扮演着重要角色来确保安全性。然而&am…

OCC+VS+QT项目配置

1、安装好VS2022、QT、OCC安装包后&#xff0c;在VS2022中创建一个项目&#xff0c;具体如下&#xff1a; 2、配置步骤1中创建的项目的属性&#xff0c;具体如下&#xff1a; VC目录>>>包含目录&#xff1a; 添加文件目录如上三个。 VC目录>>>库目录&#xf…

【权威发布】2024年人工智能与机械设计国际会议(ICAIMD 2024)

2024年人工智能与机械设计国际会议 2024 International Conference on Artificial Intelligence and Mechanical Design 会议简介 2024年人工智能与机械设计国际会议是一个专注于探讨人工智能与机械设计交叉领域最新发展的国际盛会。本次会议汇集了全球顶尖的专家学者、研究人员…

【Apollo配置中心】集成springboot自动监听属性变更和动态发布配置

1. 背景 在实际项目中&#xff0c;Spring Boot项目结合使用Apollo配置中心时&#xff0c;经常会遇到需要更新Apollo上的项目的一些配置&#xff0c;比如测试环境或生产环境中&#xff0c;需要修改某个类的属性值&#xff0c;如果我们在Apollo上更新了配置&#xff0c;已经在运…

Swift 序列(Sequence)排序面面俱到 - 从过去到现在(三)

概述 在上一篇 Swift 序列(Sequence)排序面面俱到 - 从过去到现在(二) 博文中,我们介绍了如何构建一个自定义类型中“多属性”排序的通用实现。 而在本课中我们将再接再厉介绍 iOS 15+ 中新的排序机制,并简要剖析就地排序(In-place sorting)对运行性能有着怎样的显著影…

Stable Diffusion 如何写出更优雅的 Prompt

在看了前面的课程后&#xff0c; 相信很多人都会有一个困惑&#xff0c;这个 prompt 咋写… 为什么我写的时候只能憋出来了一个 a girl, a boy, beautify … 再也想不到其他的了&#xff0c; 总感觉是吃了没文化的亏&#xff1f; 这一节课我们就来讲一讲 如何写好 prompt …

docker 部署kafka,zokeeper,快速开发模式

docker-compse 启动文件 version: 3name: kafka1services:zookeeper:image: bitnami/zookeeper:latestports:- "2181:2181"environment:- ALLOW_ANONYMOUS_LOGINyes # volumes: # - zookeeper_vol:/data # - zookeeper_vol:/datalog # - zookeepe…

MATLAB神经网络---激活层

reluLayer 修正线性单元 (ReLU) 层 ReLU 层对输入的每个元素执行阈值运算&#xff0c;其中任何小于零的值都设置为零。 此运算等效于 语法 layer reluLayer 创建一个 ReLU 层。 layer reluLayer(Name,Name) 创建一个 ReLU 层&#xff0c;并使用名称-值对组设置可选的 Nam…

光纤跳线(又称光纤连接器)的种类

光纤跳线&#xff08;又称光纤连接器&#xff09;&#xff0c;也就是接入光模块的光纤接头&#xff0c;也有好多种&#xff0c;且相互之间不可以互用。SFP模块接LC光纤连接器&#xff0c;而GBIC接的是SC光纤连接器。下面对网络工程中几种常用的光纤连接器进行详细的说明&#x…

4月美团社招测试凉经

面经哥只做互联网社招面试经验分享&#xff0c;关注我&#xff0c;每日推送精选面经&#xff0c;面试前&#xff0c;先找面经哥 一面&#xff08;凉凉&#xff09; 1、自我介绍 2、移动端的需求怎么测试&#xff1f; 3、移动端的测试侧重点是什么&#xff1f; 4、自动化测试…

如何设计一个秒杀系统?

如何从整体角度&#xff0c;去设计一个秒杀系统。秒杀系统主要有这几个特征&#xff1a; 瞬时间的流量特别高。过了秒杀的时间&#xff0c;流量就会瞬时结束 大批量用户同时请求极少数商品 在秒杀时间前&#xff0c;可能会有很多请求过来。比如在11点抢票开始&#xff0c;10点…

后继者00

题目链接 后继者 题目描述 注意点 题目中的树是二叉搜索树节点p在二叉搜索树中一定存在 解答思路 本题关键是找到值大于节点p的值的第一个节点&#xff0c;因为本题中的树是二叉搜索树&#xff0c;所以左子树的值始终小于根节点&#xff0c;右子树的值始终大于根节点访问到…

导入导出带下拉框模版(EasyExcel)

前言 项目进行到新的一个迭代了&#xff0c;赶了1周需求&#xff0c;接口终于处理完了。分享记录下迭代中处理导入、导出、下载模版功能的细节吧。 一、场景 EasyExcel&#xff08;阿里&#xff09;实现Excel数据处理三层表头&#xff0c;第二、三层表头动态数据根据第二、三层…

【技术】MySQL 8.4 免安装版配置

MySQL 8.4 免安装版配置 官网下载压缩包解压文件创建配置文件初始化数据库安装MySQL服务链接数据库修改密码 官网下载压缩包 从MySQL官网下载压缩包&#xff0c;官网&#xff1a;https://www.mysql.com/ 头部菜单点击【DOWNLOADS】&#xff0c;跳转到下载页面。在页面底部点击…

【FreeRTOS】内存管理笔记

一、为什么要自己实现内存管理&#xff1f; 后续的章节涉及这些内核对象&#xff1a;task、queue、semaphores和event group等。为了让FreeRTOS更容 易使用&#xff0c;这些内核对象一般都是动态分配&#xff1a;用到时分配&#xff0c;不使用时释放。使用内存的动态管理功能&…

unity 简易异步socket

1.unity 同步socket 改异步 using System.Collections; using System.Collections.Generic; using UnityEngine; using System.Net.Sockets; using UnityEngine.UI; using System.Threading; using System;public class Echo : MonoBehaviour {//定义套接字Socket socket;//UG…