zoukankan      html  css  js  c++  java
  • for-in和for 循环 的区别

      以前早就知道,for...in 语句用于对数组或者对象的属性进行循环操作,而for循环是对数组的元素进行循环,而不能引用于非数组对象,

    但咱在js项目里,遇到循环,不管是数组还是对象,经常使用for-in循环,因为可以少敲代码嘛,看看各自语法就知道了:

    for (变量 in 对象/数组)
    {
        在此执行代码
    }
    for(int 变量初始值;条件;递增或递减){
        在此执行代码
    }

    但今天遇到了一个坑,废了半天劲才找出原因,也算是为咱以前的懒惰买了单吧..

    今天老大要咱写一个类似于双色球抽奖的js程序模型,咱就想了,不就几十行代码的事嘛,当即保证半小时内完成,那只结果就被for-in给坑了,

    我开始写的一段,用于生成号码的程序:

    function doubleball(){
        /*6个红球,范围1~33之间,数字不能重复 升序排列*/
        /*1个蓝球b,范围1~16之间 返回 红球字符串+|+b*/
    
        var numArr=[];
    
        while(numArr.length<6){
          var r=parseInt((Math.random()*33+1));
    //       for(var i=0;i<numArr.length; i++)
             for(var i in numArr){
               console.log('i:'+i);
               if(r==numArr[i])break;
             }
          console.log('for:'+i,'len:'+numArr.length);
            i==numArr.length&&numArr.push(r);   // 永远不能执行,即死循环
        }
      }
      doubleball();

    表面上看着没什么,可是运行起来老是卡死,

    结果F12打开控制台,发现:

    也就是说,for-in的下标出来后停在数组最后一个下标上(没有for里面最后的i++,即比最后一个下标大1),所以永远不能执行push炒作,也就是永远跳不出while循环,坑爹呀,

    没办法只能使用普通的for循环了:

    function doubleball(){
        /*6个红球,范围1~33之间,数字不能重复 升序排列*/
        /*1个蓝球b,范围1~16之间 返回 红球字符串+|+b*/
    
        var numArr=[];
    
        while(numArr.length<6){
          var r=parseInt((Math.random()*33+1));
           for(var i=0;i<numArr.length; i++){
    //         for(var i in numArr){
               console.log('i:'+i);
    //           if(r==numArr[i])break;
             }
          console.log('for:'+i,'len:'+numArr.length);
    //      i==numArr.length&&
            numArr.push(r);
        }
      }
      doubleball();

    再看调试结果:

    对上了,,

    所以最终的代码程序为:

    function doubleball(){
      /*6个红球,范围1~33之间,数字不能重复 升序排列*/
      /*1个蓝球b,范围1~16之间 返回 红球字符串+|+b*/
    
      var numArr=[];
      while(numArr.length<6){
        var r=parseInt((Math.random()*33+1));
         for(var i=0;i<numArr.length; i++){
              if(r==numArr[i])break;
           }
        i==numArr.length&&numArr.push(r);
      }
      numArr.sort(function(a,b){return a-b});
      var b=parseInt((Math.random()*16+1));
      return String(numArr)+'|'+b;
    }
    document.write(doubleball());

    运行结果为:

    搞定!!

     记住,记住,下次不犯!!!

  • 相关阅读:
    Git标签使用技巧
    Git入门基本概述
    过滤器+缓存在.NET5WebApi项目中的简单使用
    在.NET5中 使用JWT鉴权授权
    Git常用开发命令
    时间戳的实际使用
    两个日期字段相减,进行计算
    MQ的理论理解
    第一周学习C语言的总结!
    问题(the question)
  • 原文地址:https://www.cnblogs.com/web-fusheng/p/6724890.html
Copyright © 2011-2022 走看看