js 数组的for循环到底应该怎么写?


Posted in Javascript onMay 31, 2010

然后来看看今天我开始怀疑哪个权威哦家伙了。。。

自从开始学编程,自从接触到数组这个东西,我就一直在不同的地点和不同的时间不断看到有人提醒:在用for遍历数组的时候一定要用 for(var i=0,n=arr2.length;i<n;i++)的方式哦,而不要用for(var i=0;i>arr.length;i++)的方式哦,因为用脑子想想也知道,第二种方法的第二部分会一直去计算数组的length,所以自然效率比较低。

哦?我们这里不说其他程序语言,而只讨论js,因为不同的语言,实现可能不同,其他语言是什么情况还要靠大家去探索喽。 其实上面说到的所谓的“动脑子想想就知道”也许只是因为大家只是用脑子想了想,而不是仔细想了想或者亲自去试了试。所以现在我们仔细想想,第一种写法真的会比第二种写法快么?arr.length会耗费很多cpu么?不会啊,为什么要耗费cpu呢?arr.length并不是调用了一个方法,而只是读取了一下数组的length属性啊,你认为读取原生属性和读取定义的变量,哪个会快呢? 我认为读取length会更快,所以我写了个测试来测试自己的想法: 我用了一个我自己的小测试框架,

var arr=[],arr2=[],i=0 
while(i<100000){ 
arr.push(i) 
arr2.push(i) 
i++ 
} 
M.TA.begin("0000"); 
for(var i=0;i<arr.length;i++){ 
arr[i]=arr[i]*arr[i]*arr[i] 
} 
M.TA.end("0000","for(var i=0;i<arr.length;i++)") 
M.TA.begin("0001"); 
for(var i=0,n=arr2.length;i<n;i++){ 
arr2[i]=arr2[i]*arr2[i]*arr2[i] 
} 
M.TA.end("0001"," for(var i=0,n=arr2.length;i<n;i++)") 
M.TA.showResult()

当然,这段代码是很变态的,占用了300多兆的内存。 结果如下:
chrome
js 数组的for循环到底应该怎么写?
firefox
js 数组的for循环到底应该怎么写?
(在做过N种性能测试后发现firefox在基础运算上的效率比chrome高很多,只是涉及到渲染的就慢很多了)
ie8
js 数组的for循环到底应该怎么写?
(减少了N个数量级之后的记过,上述脚本在ie里无法运行)
总结:?
其实做这个测试不是为了强调for(var i=0;i<arr.length;i++)的写法快多少,因为测试也是有些许误差的,只是为了说明这种写法并不会慢到哪里去,而且这种写法有一定的灵活性,书写也简单,代码量又少,那我们为什么不用它呢? 如果是第一种写法,在循环的时候数组长度发生变化呢?这种情况就处理不了了吧

其实我还是尊敬权威的,所以写到这里的时候我心里仍然提心吊胆,难道是我哪里搞错了么?如果是,大家就当一笑而过吧,如果不是,那我总算写了篇人模狗样的博文了。。。
转载注明:
http://www.html-js.com

Javascript 相关文章推荐
setTimeout和setInterval的浏览器兼容性分析
Feb 27 Javascript
javascript转换字符串为dom对象(字符串动态创建dom)
May 10 Javascript
基于jquery的一个拖拽到指定区域内的效果
Sep 21 Javascript
JS获取select-option-text_value的方法
Dec 26 Javascript
jQuery固定元素插件scrolltofixed使用指南
Apr 21 Javascript
轻松学习jQuery插件EasyUI EasyUI创建树形菜单
Nov 30 Javascript
jQuery实现的多张图无缝滚动效果【测试可用】
Sep 12 Javascript
详解angular中如何监控dom渲染完毕
Jan 03 Javascript
微信分享调用jssdk实例
Jun 08 Javascript
angular实现页面打印局部功能的思考与方法
Apr 13 Javascript
jQuery实现鼠标滑过商品小图片上显示对应大图片功能【测试可用】
Apr 27 jQuery
生成无限制的微信小程序码的示例代码
Sep 20 Javascript
javascript 四则运算精度修正函数代码
May 31 #Javascript
ASP 过滤数组重复数据函数(加强版)
May 31 #Javascript
javascript 子窗体父窗体相互传值方法
May 31 #Javascript
js post方式传递提交的实现代码
May 31 #Javascript
JS 类型转换常见方法小结
May 31 #Javascript
javascript 传统事件模型构造的事件监听器实现代码
May 31 #Javascript
LazyLoad 延迟加载(按需加载)
May 31 #Javascript
You might like
ThinkPHP中的create方法与自动令牌验证实例教程
2014/08/22 PHP
Laravel 5 框架入门(一)
2015/04/09 PHP
PHP文件管理之实现网盘及压缩包的功能操作
2017/09/20 PHP
PHP模版引擎原理、定义与用法实例
2019/03/29 PHP
PHP文件打开关闭及读写操作示例解析
2020/08/06 PHP
为JavaScript提供睡眠功能(sleep) 自编译JS引擎
2010/08/16 Javascript
jQuery学习笔记[1] jQuery中的DOM操作
2010/12/03 Javascript
Vue.js每天必学之过滤器与自定义过滤器
2016/09/07 Javascript
easyui取消表单实时验证,提交时统一验证的简单实例
2016/11/07 Javascript
js省市区级联查询(插件版&amp;无插件版)
2017/03/21 Javascript
AngularJS解决ng-if中的ng-model值无效的问题
2017/06/21 Javascript
JavaScript实现快速排序的方法分析
2018/01/10 Javascript
JS实现获取数组中最大值或最小值功能示例
2019/03/02 Javascript
你或许不知道的一些npm实用技巧
2019/07/04 Javascript
纯 JS 实现放大缩小拖拽功能(完整代码)
2019/11/25 Javascript
基于vue和websocket的多人在线聊天室
2020/02/01 Javascript
js实现复制粘贴的两种方法
2020/12/04 Javascript
python和bash统计CPU利用率的方法
2015/07/10 Python
在Python的Django框架中加载模版的方法
2015/07/16 Python
python linecache 处理固定格式文本数据的方法
2019/01/08 Python
PyQt5多线程刷新界面防假死示例
2019/12/13 Python
Django 项目通过加载不同env文件来区分不同环境
2020/02/17 Python
解决python -m pip install --upgrade pip 升级不成功问题
2020/03/05 Python
Python3开发实例之非关系型图数据库Neo4j安装方法及Python3连接操作Neo4j方法实例
2020/03/18 Python
在django中实现choices字段获取对应字段值
2020/07/12 Python
Python Pygame实现俄罗斯方块
2021/02/19 Python
CSS3实现时间轴效果
2016/07/11 HTML / CSS
基于CSS3 animation动画属性实现轮播图效果
2017/09/12 HTML / CSS
成品仓管员工作职责
2013/12/29 职场文书
施工材料员岗位职责
2014/02/12 职场文书
体育课外活动总结
2014/07/08 职场文书
终止劳动合同证明书样本
2014/11/19 职场文书
2014年最新版离婚协议书范本
2014/11/25 职场文书
2016年“6.26”禁毒宣传月系列活动总结
2016/04/05 职场文书
文书工作总结(范文)
2019/07/11 职场文书
python的变量和简单数字类型详解
2021/09/15 Python