以前早就知道,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());

运行结果为:

搞定!!

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

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. pycharm断点调试

    step over 执行下一步 蓝色高亮的那一行表示准备执行的代码

  2. Loadrunder场景设计篇——IP欺骗

    适用协议 LoadRunner的多ip功能允许运行在单一负载生成器上的Vuser可以通过多ip被识别.服务器和路由识别这些vuser为来自不同负载生成器上.   2  在负载生成器(load gene ...

  3. Linux系统crontab定时调度Python脚本

    Linux系统crontab定时调度Python脚本 一.Python脚本随Linux开机自动运行 #Python脚本:/home/edgar/auto.py #用root权限编辑以下文件:/etc/ ...

  4. Linux网络IO函数以及TCP连接函数包装

    标准I/O VS 网络IO 标准I/O又称为标准I/O流,从某种意义上讲是全双工的,因为程序能够在同一个流上执行输入和输出. Unix/Linux对网络的抽象是一种称为套接字的文件类型.和任何Unix ...

  5. Spring 模块

  6. php读取csv乱码问题解决方法

    <form action="erxian_cy.php" method="post" enctype="multipart/form-data& ...

  7. UNIDAC的安装

    UNIDAC的安装1.在source目录中找到对应Delphi版本目录的make.bat文件,修改其中的 set IdeDir="D:\Application\DelphiXE2指到你的de ...

  8. ==和equals在比较字符串时候的区别

    作为一个菜鸟  之前一直迷茫 都说比较字符串要用equals()方法  但是有时候用==貌似也可以  话不多说  先来一个例子 public static void main(String[] arg ...

  9. tomcat绿色版——运行一闪而过的解决方法

    首先配置好jdk的环境变量 %JAVA_HOME%\bin;注意:一定是英文状态下的分号结尾 %TOMCAT%\bin;注意:一定是英文状态下的分号结尾 service.bat install ser ...

  10. java 对类型的基本操作小结

    1.json 字符串转换成对象 SyncCarriageStatusDTO dto= JSON.parseObject(value,SyncCarriageStatusDTO.class); List ...