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 相关文章推荐
JS 实现双色表格实现代码
Nov 24 Javascript
javascript两段代码,两个小技巧
Feb 04 Javascript
jQuery 选择表格(table)里的行和列及改变简单样式
Dec 15 Javascript
JavaScript中为什么null==0为false而null大于=0为true(个人研究)
Sep 16 Javascript
JS实现拖动示例代码
Nov 01 Javascript
js继承call()和apply()方法总结
Dec 08 Javascript
PHP+mysql+Highcharts生成饼状图
May 04 Javascript
JavaScript过滤字符串中的中文与空格方法汇总
Mar 07 Javascript
js提交form表单,并传递参数的实现方法
May 25 Javascript
Angular.JS判断复选框checkbox是否选中并实时显示
Nov 30 Javascript
详解如何用babel转换es6的class语法
Apr 03 Javascript
微信小程序下拉框功能的实例代码
Nov 06 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
提高php运行速度的一些小技巧分享
2012/07/03 PHP
thinkPHP中钩子的两种配置调用方法详解
2016/11/11 PHP
浅谈ThinkPHP中initialize和construct的区别
2017/04/01 PHP
JavaScript 学习笔记(七)字符串的连接
2009/12/31 Javascript
Jquery网页出现的乱码问题的三种解决方法
2013/06/30 Javascript
五种js判断是否为整数类型方式
2015/12/03 Javascript
详解Javascript中的Object对象
2016/02/28 Javascript
详解Node.js:events事件模块
2016/11/24 Javascript
vue2的todolist入门小项目的详细解析
2017/05/11 Javascript
vue绑定class与行间样式style详解
2017/08/16 Javascript
vue用递归组件写树形控件的实例代码
2018/07/19 Javascript
echarts实现折线图的拖拽效果
2019/12/19 Javascript
[03:42]2014DOTA2西雅图国际邀请赛7月9日TOPPLAY
2014/07/09 DOTA
python列表操作使用示例分享
2014/02/21 Python
Python xlrd读取excel日期类型的2种方法
2015/04/28 Python
Python找出文件中使用率最高的汉字实例详解
2015/06/03 Python
详解使用Python处理文件目录的相关方法
2015/10/16 Python
详解Python发送邮件实例
2016/01/10 Python
使用py2exe在Windows下将Python程序转为exe文件
2016/03/04 Python
python爬取m3u8连接的视频
2018/02/28 Python
完美解决Pycharm无法导入包的问题 Unresolved reference
2018/05/18 Python
Python操作mongodb的9个步骤
2018/06/04 Python
python 实现交换两个列表元素的位置示例
2019/06/26 Python
如何在python中实现随机选择
2019/11/02 Python
Python *args和**kwargs用法实例解析
2020/03/02 Python
python3用PyPDF2解析pdf文件,用正则匹配数据方式
2020/05/12 Python
Python爬虫爬取糗事百科段子实例分享
2020/07/31 Python
python元组拆包实现方法
2021/02/28 Python
水污染治理专业毕业生推荐信
2013/11/14 职场文书
私人房屋买卖协议书
2014/10/04 职场文书
党员“四风”问题批评与自我批评思想汇报
2014/10/06 职场文书
2015年办公室文员工作总结
2015/04/24 职场文书
《家》读后感:万惜拯救,冷暖自知
2019/09/25 职场文书
Java中try catch处理异常示例
2021/12/06 Java/Android
关于MySQL临时表为什么可以重名的问题
2022/03/22 MySQL
mysql sock文件存储了什么信息
2022/07/15 MySQL