引子

这是一段很简单的代码,但是即便是这么简单的东西,这里我们还是需要说一下。

关于for循环整个执行流程就是,先执行var i=10,然后到了第二个语句,判断10是否大于0,很明显为true,所以此时执行for里面的循环语句,执行完毕之后再执行第三个语句,i--。由于这里的第三个语句是最后一个执行,所以此处无论是写i--还是--i都是一样的。输出结果如下。

有10,但是没有0,因为输出1的时候,i--此时i=0,判断语句0>0为false所以跳出了循环。

深入

这时候,我们用的不再是那么简单了。细分一下这个for循环,其实不同的地方就是中间的条件判断由常见的的i>0,变成了i,其实有没有发现,所谓的i>0本身就有点类似于if(i>0),这样的语句,只有当输出为true时才执行for下面的循环,所以此处的i条件其实差不多也是这样的if(i),再具体化一点就是if(i==true),那么这个if什么时候才是false呢,js基础好点的都知道,当i是0或者undefined以及null的时候这个判断就变成false,也即是我们的for循环,只有当i==0时才会跳出,所以输出结果如下:

正文

接下来就到了我们的正文部分,讲解下for循环的倒序法,代码再进一步优化

第三个语句直接合并到了第二个语句中。有了第二个例子的经验,这里我们也是同样的分析,i--变成了if(i--),所以这次的过程就是,先定义i=10,然后if(10),判断结束后10--,所以第一个输出的应该是9。

接下来的过程也是一样,先判断,然后--,一直输出到0。所以结果如下

扩展

这里,我们再把代码改一下,i--变成--i,也就是这样

那么这次的流程应该是这样,先是10--变成了9,然后if(9),这个时候输出的第一个值就是9,然后一直循环,直到i=1的时候,此时先1--变成了0,然后if(0)跳出循环,所以这次的输出并没有0,结果如下

性能

从性能上来说,这种倒序法的效率是比正常的for循环还要快的,至于它的原因我也是刚刚得知,是一个博主在回复我的评论的时候说到的,我也是挺同意他的说法。

因为倒序循环每个控制条件只是简单地与零进行比较。控制条件与true 值进行比较,任何非零数字自动强制转换为true,而零等同于false。控制条件已经从两次比较(迭代少于总数吗?它等于true 吗?)减少到一次比较(它等于true 吗?)。将每个迭代中两次比较减少到一次可以大幅度提高循环速度。

也就是说,使用倒序循环,使得原本的i<10这种需要迭代,同时迭代后还要判断,加起来共两次的比较变成了只是简单的判断true、false的一次比较,所以从性能上优化了原本的正常写法。

讲解下for循环的用法,加深记忆的更多相关文章

  1. if continue的用法(跳过本次循环,执行下一个循环)

    Python continue 语句跳出本次循环 当需要跳过本次循环的时候,使用continue能跳过本次循环,直接下一个循环 如下脚本: for url in alllink: if url == ...

  2. js 递归下的循环

    的递归下的循环不能使用forEach  可以使用for代替 错误写法 // 获取完整名字 var getFullName = function(code, resultName) { if (code ...

  3. XP/Win7下QTP11循环试用30天的破解方法

    XP/Win7下QTP11循环试用30天的破解方法. XP下:1.找到以下路径:C:\Documents and Settings\All Users\Application Data\SafeNet ...

  4. CentOS7下Firewall防火墙配置用法详解

    官方文档地址: https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/7/html/Security_Guide ...

  5. 神奇的输入 while(cin>>....)如何在遇见换行之后进入下一层循环读入

    cin>>m>>n; ;i<=m;i++) { ; char ch=' '; ) //在遇到换行之后进入下一层循环读入. { x++; cin>>c[x]; ...

  6. linux下find查找命令用法

    Linux下find命令在目录结构中搜索文件,并执行指定的操作.Linux下find命令提供了相当多的查找条件,功能很强大.由于find具有强大的功能,所以它的选项也很多,其中大部分选项都值得我们花时 ...

  7. bash 编程中循环语句用法

    1.if 是单分支语句,使用格式如下: if condition ; then statement ….. fi 2.if … else 是双分支语句,使用格式如下: if condition ; t ...

  8. sql 游标 跳出循环 和进入下一个循环

    1  使用break 结束整个循环. 2  使用continue 结束当前循环,进入下已循环. 注意:使用continue造成死循环,是因为continue后又执行与上次相同的fetch了. 解决办法 ...

  9. 理解 ARC 下的循环引用

    本文由 伯乐在线 - nathanw 翻译,dopcn 校稿.未经许可,禁止转载!英文出处:digitalleaves.com.欢迎加入翻译组. ARC 下的循环引用类似于日本的 B 级恐怖片.当你刚 ...

随机推荐

  1. A. Liserious战队

    Liserious战队是一支活跃在京沪地区的著名密室逃脱战队,在优秀的队长Liserious和芳姐的带领下,打遍天下大大小小的密室逃脱,攻无不克,战无不胜,上天入地无所不能. 世界密室逃脱委员会以IS ...

  2. Android中如何判断是否联网

    首先在AndroidManifest.xml中添加与连接网络相关的权限: [xhtml]  view plain copy   <uses-permission android:name=&qu ...

  3. Android开发之TextView排版问题

    下面直接是关于解决该问题的代码(根据别人的代码进行了修正以及测试,保证可以修改字体尺寸.颜色.根据padding调整,如果需要支持其他的格式可以将对应的属性添加至Paint类型的对象中):   1 p ...

  4. 【Web】java异常处理

    J2EE中一般对异常状况的处理都可以用两种情况对其进行相应处理. 1. 通常情况下,一般异常处理可以选择用throw.throws从底层一直往上面抛,直到抛到Action,让其将异常显示在页面上面进行 ...

  5. Linux如何修改SSH端口号

    SSH是什么? SSH 为 Secure Shell 由 IETF 的网络工作小组(Network Working Group)所制定: SSH 是建立在应用层和传输层基础上的一种安全协议. SSH传 ...

  6. sizeof,一个其貌不扬的家伙(转)

    sizeof,一个其貌不扬的家伙,引无数菜鸟竟折腰,小虾我当初也没少犯迷糊,秉着“辛苦我一个,幸福千万人”的伟大思想,我决定将其尽可能详细的总结一下.但当我总结的时候才发现,这个问题既可以简单,又可以 ...

  7. 一步一步重写 CodeIgniter 框架 (11) —— 使用 CodeIgniter 函数库

    在完成了CI框架的类库扩展后,很自然我们就会想到函数库的扩展.函数库的扩展在 CI 中称为 helper 函数与类有不同的地方,它不能继承,只能覆盖或者添加新的函数,或者直接完全新定义的一组函数. 由 ...

  8. word2vec 中的数学原理具体解释(五)基于 Negative Sampling 的模型

      word2vec 是 Google 于 2013 年开源推出的一个用于获取 word vector 的工具包,它简单.高效,因此引起了非常多人的关注. 因为 word2vec 的作者 Tomas ...

  9. 删除: warning C4996: &#39;sprintf&#39;: This function or variable may be unsafe. Consider 方法

    可以使用的最简单的方法: 选项Project   |   Configuration   Properties   |   C/C++   |   Preprocessor   |   Preproc ...

  10. javascript每日一练(十)——运动二:缓冲运动

    一.缓冲运动 实现原理:(目标距离-当前距离) / 基数 = 速度(运动距离越大速度越小,运动距离和速度成反比) (500 - oDiv.offsetLeft) / 7 = iSpeed; 需要注意: ...