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());
运行结果为:

搞定!!
记住,记住,下次不犯!!!
for-in和for 循环 的区别的更多相关文章
- do while 循环和while循环的区别
do while 循环和while循环的区别 1.do while循环是先执行循环体,然后判断循环条件,如果为真,则执行下一步循环,否则终止循环: while循环是先判断循环条件,如果条件为真则 ...
- python中生成器对象和return 还有循环的区别
python中生成器对象和return 还有循环的区别 在python中存在这么一个关键字yield,这个关键字在项目中经常被用到,比如我写一个函数不想它只返回一次就结束那我们就不能用return,因 ...
- [shell] while read line 与for循环的区别
[shell] while read line 与for循环的区别 while read line 与for循环的区别---转载整理 while read line 是一次性将文件信息读入并赋值给变量 ...
- [转载]Java迭代器(iterator详解以及和for循环的区别)
Java迭代器(iterator详解以及和for循环的区别) 觉得有用的话,欢迎一起讨论相互学习~[Follow] 转载自 https://blog.csdn.net/Jae_Wang/article ...
- Node.js event loop 和 JS 浏览器环境下的事件循环的区别
Node.js event loop 和 JS 浏览器环境下的事件循环的区别: 1.线程与进程: JS 是单线程执行的,指的是一个进程里只有一个主线程,那到底什么是线程?什么是进程? 进程是 CPU ...
- js之for与forEach循环的区别
回武汉打卡第四天,武汉加油,逆战必胜!今天咱们探讨一下for循环和forEach()循环的区别. 首先,for循环在最开始执行循环的时候,会建立一个循环变量i,之后每次循环都是操作这个变量,也就是说它 ...
- for循环,for…in循环,forEach循环的区别
for循环,for…in循环,forEach循环的区别for循环通关for循环,生成所有的索引下标for(var i = 0 ; i <= arr.length-1 ; i++){ 程序内容 } ...
- for, for in, for of, map, forEach 循环的区别:
for, for in, for of, map, forEach 循环的区别: for 遍历数组: //对象遍历数组 var arr = [ {Monday: '星期一', Tuesday: ' ...
- do-while循环和三种循环的区别
循环语句3--do...while do...while循环格式 初始化表达式① do{ 循环体③ 步进表达式④ }while(布尔表达式②); 执行流程 执行顺序:①③④>②③④>②③④ ...
- for ,foreach ,map 循环的区别
一.for循环 1.for - 循环代码块一定的次数 遍历数组最常用到的for循环,是最为熟知的一种方法 for (var i=0; i<5; i++) { x=x + "The nu ...
随机推荐
- samba、nginx服务
一.部署samba Samba是在Linux和UNIX系统上实现SMB协议的一个免费软件,由服务器及客户端程序构成,Samba主要用于Linux或UNIX和Windows系统之间的文件共享. SMB( ...
- Redis五大数据类型及操作
目录: 一.redis的两种链接方式 二.redis的字符串操作(string) 三.redis的列表操作(list) 四.redis的散列表操作(类似于字典里面嵌套字典) 五.redis的集合操作( ...
- Apache添加多端口
Apache\conf 目录下 添加端口监听 Vhost.conf简单写写
- URAL 2081 Faulty dial
题目: Faulty dial Pavel has not played ACM for ages, nor does he train teams, nor prepare problems. Th ...
- master: Error: JAVA_HOME is not set and could not be found.问题解决
- MySQL的索引实现原理
MySQL数据库索引总结使用索引的原由数据结构Hash.平衡二叉树.B树.B+树区别机械硬盘.固态硬盘区别Myisam与Innodb B+树的区别MySQL中的索引什么数据结构B+树中的节点到底存放多 ...
- orecle触发器
一.触发器简介 触发器的定义就是说某个条件成立的时候,触发器里面所定义的语句就会被自动的执行.因此触发器不需要人为的去调用,也不能调用.然后,触发器的触发条件其实在你定义的时候就已经设定好了.这里面需 ...
- 使用VBS打开程序和关闭程序
下面这个是先执行程序后,然后再结束程序. Dim Wsh Set Wsh = WScript.CreateObject("WScript.Shell") '下行是设置延时启动时间 ...
- 数字组合问题:Combination,CombinationSum,CombinationSum2,CombinationSum3
Combination问题描述:给定n和k,找出1-n之间所有k个数的组合,例如:n=3,k=2,返回 [[1,2] [1,3] [2,3]] 算法分析:利用递归.递归边界就是curr.size( ...
- 为什么Kubernetes不使用libnetwork
Kubernetes 在 1.0 版本之前就已经有了最初的网络插件.与此同时 Docker 也引入了 libnetwork 和 Container Network Model (CNM).现在 Doc ...