引子

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

关于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的一次比较,所以从性能上优化了原本的正常写法。

最新文章

  1. H5框架之Bootstrap(二)
  2. 查询oracle数据库,返回的数据是乱码。 PL/SQL正常。
  3. JavaScript客户端MVC 框架综述
  4. BeforeProperties/AfterProperties in Event Receivers
  5. php -l 检查文件是否语法错误
  6. div居中问题
  7. MSSQL手札三 MSSQL存储过程
  8. 观察者模式在ng(Angular)中的应用
  9. Selenium webdriver 操作IE浏览器
  10. paip.输入法编程---带ord gudin去重复-
  11. SQL Server 判断数据库是否存在,表是否存在
  12. 杭电oj find your present (2)
  13. 201521123045 《Java程序设计》第8周学习总结
  14. 某xss挑战赛闯关笔记
  15. 《HelloGitHub》第 27 期
  16. Face The Right Way [POJ3276] [开关问题]
  17. python3 经典排序方法
  18. Revit Family API 添加对齐
  19. matlib实现梯度下降法(序一)
  20. 公钥与私钥对HTTPS的理解(数字证书的需要)

热门文章

  1. Python 連接 MySQL
  2. Dijkstra 模板 最短路
  3. server配置学习 ---- 关闭防火墙
  4. ListView.MultiChoiceModeListener
  5. Codeforces Round #315 (Div. 2C) 568A Primes or Palindromes? 素数打表+暴力
  6. 【转】OpenCV中使用神经网络 CvANN_MLP
  7. poj2947
  8. 用php 把数组中偶数,选择出来
  9. InstallShield安装包卸载-完美卸载
  10. 知识点2-5:了解Razor语法