以前早就知道,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. 将php数组存取到本地文件

    存数组: <?php $data = array( "a" => "aaaaaa", "b" => "bbbbb ...

  2. pycharm修改配置

    恢复pycharm的初始设置

  3. Web层辅助工具类

    Java web开发中经常用到的一些方法: import java.io.BufferedReader; import java.net.InetAddress; import java.net.Un ...

  4. datagrid 用法

    http://blog.csdn.net/xhhuang1979/article/details/8331682

  5. Dubbo与微服务

    http访问到服务器要经过的内容:Nginx —Tomcat –db,nginx就是一个负载均衡左右.又一次面试问到了我nginx的反向代理.现在想了想面试官要问的应该是 域名的反向代理,就是使用一个 ...

  6. Python3:文件读写

    Python3:文件读写 open f = open('filename','r') # 读模式 f = open('filename','w') # 写模式 f = open('filename', ...

  7. 超详细 Linux 下编译安装Redis 以及php配套使用

    一.Linux 下安装Redis 下载地址:http://redis.io/download,下载最新文档版本. 把鼠标移到上图的绿色框上,就会显示下图提示:(直接右键复制链接就好) 本教程使用的旧版 ...

  8. bower安装使用、git安装、node安装、weui安装开发

    bower安装使用以及git安装 bower需要:node 和 git 1.Git安装:(选择第二项:Use Git from the Windows Command Prompt)2.node安装: ...

  9. spring整合redis配置

    第一步:添加需要的jar包 <!-- redis --> <dependency> <groupId>redis.clients</groupId> & ...

  10. Oracle索引以及索引碎片

    索引,可以增加查询速度,若没有索引,每次查询都必须是全表查询.例如,搜索某个记录时(如name="gdpuzxs")时,需要全表扫描一下,因为不知道有多少个name="g ...