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());

运行结果为:

搞定!!

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

原文地址:https://www.cnblogs.com/web-fusheng/p/6724890.html