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

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

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

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

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

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

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

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

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

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

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

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

再看调试结果:

对上了,,

所以最终的代码程序为:

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

运行结果为:

搞定!!

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

for-in和for 循环 的区别的更多相关文章

  1. do while 循环和while循环的区别

    do while 循环和while循环的区别 1.do while循环是先执行循环体,然后判断循环条件,如果为真,则执行下一步循环,否则终止循环:    while循环是先判断循环条件,如果条件为真则 ...

  2. python中生成器对象和return 还有循环的区别

    python中生成器对象和return 还有循环的区别 在python中存在这么一个关键字yield,这个关键字在项目中经常被用到,比如我写一个函数不想它只返回一次就结束那我们就不能用return,因 ...

  3. [shell] while read line 与for循环的区别

    [shell] while read line 与for循环的区别 while read line 与for循环的区别---转载整理 while read line 是一次性将文件信息读入并赋值给变量 ...

  4. [转载]Java迭代器(iterator详解以及和for循环的区别)

    Java迭代器(iterator详解以及和for循环的区别) 觉得有用的话,欢迎一起讨论相互学习~[Follow] 转载自 https://blog.csdn.net/Jae_Wang/article ...

  5. Node.js event loop 和 JS 浏览器环境下的事件循环的区别

    Node.js  event loop 和 JS 浏览器环境下的事件循环的区别: 1.线程与进程: JS 是单线程执行的,指的是一个进程里只有一个主线程,那到底什么是线程?什么是进程? 进程是 CPU ...

  6. js之for与forEach循环的区别

    回武汉打卡第四天,武汉加油,逆战必胜!今天咱们探讨一下for循环和forEach()循环的区别. 首先,for循环在最开始执行循环的时候,会建立一个循环变量i,之后每次循环都是操作这个变量,也就是说它 ...

  7. for循环,for…in循环,forEach循环的区别

    for循环,for…in循环,forEach循环的区别for循环通关for循环,生成所有的索引下标for(var i = 0 ; i <= arr.length-1 ; i++){ 程序内容 } ...

  8. for, for in, for of, map, forEach 循环的区别:

    for, for in,  for of, map, forEach 循环的区别: for  遍历数组: //对象遍历数组 var arr = [ {Monday: '星期一', Tuesday: ' ...

  9. do-while循环和三种循环的区别

    循环语句3--do...while do...while循环格式 初始化表达式① do{ 循环体③ 步进表达式④ }while(布尔表达式②); 执行流程 执行顺序:①③④>②③④>②③④ ...

  10. for ,foreach ,map 循环的区别

    一.for循环 1.for - 循环代码块一定的次数 遍历数组最常用到的for循环,是最为熟知的一种方法 for (var i=0; i<5; i++) { x=x + "The nu ...

随机推荐

  1. 搭建Mac OS X下cocos2d-x的Android开发环境

    版本 Cocos2d-x: cocos2d-2.1beta3-x-2.1.1 OS X: 10.8 Android ADT Bundle: v21.1.0 Android NDK: android-n ...

  2. 字符数组(char)和字符串(string)的转换

    #include<iostream>#include<string>using namespace std;void main(){ string LyuS = "W ...

  3. Windows 10 安装 到SSD硬盘

    1.更换SSD硬盘 2.安装windows 10 系统(升级太慢,建议全新安装) 3.全程不到1个小时个月安装完成. 4.这个分数惨不忍睹,但是速度还是蛮快. 5.挂载机械硬盘,安装驱动,window ...

  4. Deep Auto-encoder

    autoencoder可以用于数据压缩.降维,预训练神经网络,生成数据等等. autoencoder的架构 autoencoder的架构是这样的: 需要分别训练一个Encoder和一个Decoder. ...

  5. 【Spark SQL 源码分析系列文章】

    从决定写Spark SQL源码分析的文章,到现在一个月的时间里,陆陆续续差不多快完成了,这里也做一个整合和索引,方便大家阅读,这里给出阅读顺序 :) 第一篇 Spark SQL源码分析之核心流程 第二 ...

  6. php异常处理笔记

    <?php header("Content-type:text/html;charset=utf-8"); // try // { // //业务处理 错误时抛出异常. // ...

  7. 使用Ant和YUICompressor链接合并压缩你的JS和CSS代码

    JS代码和CSS代码在上线前要压缩大家应该都是知道的了.记得之前做项目的时候,最后要交差的时候是找了个网站,将JS代码的文件一个一个地复制,粘贴,复制,粘贴. 当时就在想:TMD有没有好一点的方法,劳 ...

  8. StrStr,判断一个字符串是不是另一个字符串的字串,并返回子串的位置

    public int strStr(String haystack, String needle) { if(haystack == null || needle == null) { return ...

  9. 在OpenStack里怎样配置Neutron,让虚拟机访问外网

    http://blog.csdn.net/zhangli_perdue/article/details/50264681 OpenStack里虚机(或者叫instance)只有在分配floating ...

  10. rabbitmq High Availability

    每个rabbitmq node运行RabbitMQ application,共享用户virtual hosts, queues, exchanges, etc. 一个nodes组称之为一个集群. 所有 ...