Javascript中for循环语句的几种写法总结对比

 更新时间:2017年01月23日 10:36:28   作者:十年灯  
如果您希望一遍又一遍地运行相同的代码,并且每次的值都不同,那么使用循环是很方便的,javascript中for循环也是非常常用的,下面这篇文章主要介绍了Javascript中for循环的几种写法,需要的朋友可以参考借鉴,一起来看看吧。

前言

for循环我们在js遍历对象或数组时都会有用到了,今天我们一起来看一些关于for循环的一些使用例子了,具体的操作细节如下文介绍。

一般写法如下:

for(var i = 0;i< arr.length;i++) {
 var a = arr[i];
 //...
 }

这就是一个常见的,正序循环的for循环。这样写的缺点大家都明白:每次都从arr里取length与i来对比,浪费性能(而且,要是arr的长度是动态变化的,就会出现死循环)。改进这个循环的办法是用变量保存arr.length

for(var i = 0, al = arr.length;i< al;i++) {
 var a = arr[i];
 //...
 }

这样比第一种可以略微提升点性能,要是数组长,可以提升更多。

不过这样写就多了个变量al,且这个变量只在用来与i对比的时候有用,看着有点鸡肋。

如果循环顺序对你不重要,那你可以尝试倒序循环:

for(var i = arr.length-1;i > -1;i--) {
 var a = arr[i];
 //...
 }

这样一来变量少些,且还缓存过arr长度,性能也不错。但这里的代码写得有点拙劣(我故意的),首先是i = arr.length-1(居然要-1,靠),然后是循环继续执行的条件i > -1,都让有洁癖的人无法忍受。

下面是我常用的倒序for循环写法:

for(var i = arr.length;i--;) {
 var a = arr[i];
 //...
 }

这已经非常精简了。原理需要理解一下:for循环继续执行的条件,是;;之间的这个判断要为真,而这里的i–,在第一次循环进来的时候,i=arr.length,i–值不变(为什么不变?因为要在for循环体里面,才会发现i变了);当i=1时,i- -还是1,但进入循环体后,就是0了,所以可以正常执行最后一次循环;当i=0时,i–还是0,而0已经不为真了,所以循环就不会继续执行了。

大家注意到上面的所有代码的for循环体里,都有个var a = arr[i] ,用来取出当前循环到的数组项。这实际上也是种浪费,且jsLint等会告诉你:不要在循环里声明变量。。。

倒序的for可以精简至斯,但我就是要正序,而且要效率高,变量少,怎么办?

如下:

for(var i = 0, a;a = arr[i++];) {
 //...
 }

这种写法好处在于:几乎不可避免的arr.length不见了,前面说的取出当前循环到的数组项的那一句也不见了。

原理:

a = arr[i++] ,在这里作为循环能执行的条件,注意这里只有一个=号,所以这不是判断句,是赋值语句,就是把arr[i++]赋给a,然后判断a是不是真值。i++与i–的原理类型我就不说了,只说当i++已经超过数组的长度时,循环肯定要停止才行,而这里真的就停止了,为什么?因为a=arr[i++] ,如果取到了超出数组本身长度的项,只会取得一个undefined,而undefined是假值,循环条件就判断失败了。

当然,这样写的缺点也很明显:

     1,当arr的长度动态变化时,依然会产生死循环————因为我们从来没缓存过arr.length呀。

     2,如果循环的是一个数字数组,当取出的项(即a的值)为0时,就会中止循环(因为0是假值)。

     3,当数组中某一项是假值时(包括空字符串,0,null,undefined),同样会中止循环

所以大家用这种写法时,最好排除掉上面的情况再用。

这个原理同样可以用在倒序循环上。

最后我要忠告大家几句:

  1. 代码精简不等于效率高!
  2. 不要为了故意精简代码而丧失性能

顺带说几点提高for循环性能的要点:

     1,适时break!不需要遍历全部的就要加跳出条件!

     2,不要在for循环体里声明变量(建议一次var,多次赋值)

     2,数组长度缓存,尽量少变量

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如有疑问大家可以留言交流。

相关文章

  • canvas实现绘制吃豆鱼效果

    canvas实现绘制吃豆鱼效果

    本篇文章主要分享了canvas实现绘制吃豆鱼效果的示例代码,具有一定的参考价值,下面跟着小编一起来看下吧
    2017-01-01
  • 微信小程序MoxB实现全局状态管理流程详解

    微信小程序MoxB实现全局状态管理流程详解

    这篇文章主要介绍了微信小程序使用MoxB实现全局状态管理方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
    2022-11-11
  • echarts多条折线图动态分层的实现方法

    echarts多条折线图动态分层的实现方法

    这篇文章主要介绍了echarts多条折线图动态分层的实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-05-05
  • js+html5实现canvas绘制网页时钟的方法

    js+html5实现canvas绘制网页时钟的方法

    这篇文章主要介绍了js+html5实现canvas绘制网页时钟的方法,涉及html5图形绘制的基础技巧,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-05-05
  • JS实现仿新浪微博发布内容为空时提示功能代码

    JS实现仿新浪微博发布内容为空时提示功能代码

    这篇文章主要介绍了JS实现仿新浪微博发布内容为空时提示功能,
    2015-08-08
  • JS实现简易留言板增删功能

    JS实现简易留言板增删功能

    这篇文章主要为大家详细介绍了JS实现简易留言板增删功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-02-02
  • 微信小程序学习总结(四)事件与冒泡实例分析

    微信小程序学习总结(四)事件与冒泡实例分析

    这篇文章主要介绍了微信小程序学习总结(四)事件与冒泡,结合实例形式分析了微信小程序事件、冒泡、数据获取相关机制、原理与操作注意事项,需要的朋友可以参考下
    2020-06-06
  • IE6/7/8/9不支持exec的简写方式

    IE6/7/8/9不支持exec的简写方式

    Firefox/Safari/Chrome/Opera浏览器中使用exec方法时可以去掉“exec”用 “正则直接量+()” 方式使用
    2011-05-05
  • npm安装依赖时出现Peer Dependencies冲突报错解决分析

    npm安装依赖时出现Peer Dependencies冲突报错解决分析

    这篇文章主要为大家介绍了npm安装依赖时出现Peer Dependencies冲突报错解决分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-09-09
  • 微信小程序引入外部icon(阿里巴巴矢量图标)的全过程

    微信小程序引入外部icon(阿里巴巴矢量图标)的全过程

    在小程序中,有默认的图标icon组件,但你会发现它的图标样式很少,可能很多时候并不能满足我们的需求,所以这篇文章主要给大家介绍了关于微信小程序引入外部icon(阿里巴巴矢量图标)的相关资料,需要的朋友可以参考下
    2022-09-09

最新评论