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


Posted in Javascript onJanuary 23, 2017

前言

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,数组长度缓存,尽量少变量

总结

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

Javascript 相关文章推荐
防止网站内容被拷贝的一些方法与优缺点好处与坏处分析
Nov 30 Javascript
JQuery扩展插件Validate—6 radio、checkbox、select的验证
Sep 05 Javascript
JavaScript初学者应注意的七个细节详细介绍
Dec 27 Javascript
jquery基础教程之deferred对象使用方法
Jan 22 Javascript
javascript跨浏览器的属性判断方法
Mar 16 Javascript
javascript控制台详解
Jun 25 Javascript
D3.js中data(), enter() 和 exit()的问题详解
Aug 17 Javascript
理解javascript中的严格模式
Feb 01 Javascript
JavaScript判断数字是否为质数的方法汇总
Jun 02 Javascript
JavaScript省市级联下拉菜单实例
Feb 14 Javascript
通过说明与示例了解js五种设计模式
Jun 17 Javascript
防止Layui form表单重复提交的实现方法
Sep 10 Javascript
基于jQuery插件jqzoom实现的图片放大镜效果示例
Jan 23 #Javascript
JavaScript在form表单中使用button按钮实现submit提交方法
Jan 23 #Javascript
canvas绘制表盘时钟
Jan 23 #Javascript
canvas绘制的直线动画
Jan 23 #Javascript
node.js实现复制文本到剪切板的功能
Jan 23 #Javascript
jQuery 全选 全不选 事件绑定的实现代码
Jan 23 #Javascript
Javascript中构造函数要注意的一些坑
Jan 23 #Javascript
You might like
PHP新手上路(九)
2006/10/09 PHP
PHP三元运算符的结合性介绍
2012/01/10 PHP
PHP 微信支付类 demo
2015/11/30 PHP
php中json_encode不兼容JSON_UNESCAPED_UNICODE的解决方案
2016/05/31 PHP
php获取文件名称和扩展名的方法
2017/02/07 PHP
PHP生成zip压缩包的常用方法示例
2019/08/22 PHP
Javascript实例教程(19) 使用HoTMetal(7)
2006/12/23 Javascript
jquery ajax 登录验证实现代码
2009/09/23 Javascript
jquery批量控制form禁用的代码
2013/08/06 Javascript
JavaScript让网页出现渐隐渐显背景颜色的方法
2015/04/21 Javascript
Clipboard.js 无需Flash的JavaScript复制粘贴库
2015/10/02 Javascript
AngularJS中如何使用$http对MongoLab数据表进行增删改查
2016/01/23 Javascript
AngularJS 视图详解及示例代码
2016/08/17 Javascript
Ajax实现不刷新取最新商品
2017/03/01 Javascript
浅谈vue实现数据监听的函数 Object.defineProperty
2017/06/08 Javascript
JS实现判断数组是否包含某个元素示例
2019/05/24 Javascript
Vue 实现一个命令式弹窗组件功能
2019/09/25 Javascript
vue开发chrome插件,实现获取界面数据和保存到数据库功能
2020/12/01 Vue.js
Python基于回溯法子集树模板解决旅行商问题(TSP)实例
2017/09/05 Python
Python 使用PIL numpy 实现拼接图片的示例
2018/05/08 Python
Python 等分切分数据及规则命名的实例代码
2019/08/16 Python
pygame实现俄罗斯方块游戏(对战篇1)
2019/10/29 Python
jupyter notebook参数化运行python方式
2020/04/10 Python
python中执行smtplib失败的处理方法
2020/07/01 Python
Python 使用xlwt模块将多行多列数据循环写入excel文档的操作
2020/11/10 Python
浅谈CSS3中的变形功能-transform功能
2017/12/27 HTML / CSS
HTML5 Plus 实现手机APP拍照或相册选择图片上传功能
2016/07/13 HTML / CSS
加利福尼亚州威尼斯的女性奢侈品设计师服装和概念店:Mona Moore
2018/09/13 全球购物
Notino匈牙利:购买香水和化妆品
2019/04/12 全球购物
日语专业毕业生自荐信
2013/11/11 职场文书
如何做好总经理助理
2013/11/12 职场文书
《一本男孩子必读的书》教学反思
2014/02/19 职场文书
学生自我评语大全
2014/04/18 职场文书
机关作风整顿个人整改措施2014
2014/09/17 职场文书
2015年机械设备管理工作总结
2015/05/04 职场文书
python 办公自动化——基于pyqt5和openpyxl统计符合要求的名单
2021/05/25 Python