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 ...
随机推荐
- 搭建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 ...
- 字符数组(char)和字符串(string)的转换
#include<iostream>#include<string>using namespace std;void main(){ string LyuS = "W ...
- Windows 10 安装 到SSD硬盘
1.更换SSD硬盘 2.安装windows 10 系统(升级太慢,建议全新安装) 3.全程不到1个小时个月安装完成. 4.这个分数惨不忍睹,但是速度还是蛮快. 5.挂载机械硬盘,安装驱动,window ...
- Deep Auto-encoder
autoencoder可以用于数据压缩.降维,预训练神经网络,生成数据等等. autoencoder的架构 autoencoder的架构是这样的: 需要分别训练一个Encoder和一个Decoder. ...
- 【Spark SQL 源码分析系列文章】
从决定写Spark SQL源码分析的文章,到现在一个月的时间里,陆陆续续差不多快完成了,这里也做一个整合和索引,方便大家阅读,这里给出阅读顺序 :) 第一篇 Spark SQL源码分析之核心流程 第二 ...
- php异常处理笔记
<?php header("Content-type:text/html;charset=utf-8"); // try // { // //业务处理 错误时抛出异常. // ...
- 使用Ant和YUICompressor链接合并压缩你的JS和CSS代码
JS代码和CSS代码在上线前要压缩大家应该都是知道的了.记得之前做项目的时候,最后要交差的时候是找了个网站,将JS代码的文件一个一个地复制,粘贴,复制,粘贴. 当时就在想:TMD有没有好一点的方法,劳 ...
- StrStr,判断一个字符串是不是另一个字符串的字串,并返回子串的位置
public int strStr(String haystack, String needle) { if(haystack == null || needle == null) { return ...
- 在OpenStack里怎样配置Neutron,让虚拟机访问外网
http://blog.csdn.net/zhangli_perdue/article/details/50264681 OpenStack里虚机(或者叫instance)只有在分配floating ...
- rabbitmq High Availability
每个rabbitmq node运行RabbitMQ application,共享用户virtual hosts, queues, exchanges, etc. 一个nodes组称之为一个集群. 所有 ...