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 相关文章推荐
javascript列表框操作函数集合汇总
Nov 28 Javascript
js中split函数的使用方法说明
Dec 26 Javascript
经过绑定元素时会多次触发mouseover和mouseout事件
Feb 28 Javascript
JS、jquery实现几分钟前、几小时前、几天前等时间差显示效果的代码实例分享
Apr 11 Javascript
JavaScript中实现最高效的数组乱序方法
Oct 11 Javascript
使用requestAnimationFrame实现js动画性能好
Aug 06 Javascript
AngularJS学习笔记(三)数据双向绑定的简单实例
Nov 08 Javascript
jQGrid动态填充select下拉框的选项值(动态填充)
Nov 28 Javascript
js实现自动图片轮播代码
Mar 22 Javascript
JavaScript中运算符规则和隐式类型转换示例详解
Sep 06 Javascript
koa2服务端使用jwt进行鉴权及路由权限分发的流程分析
Jul 22 Javascript
从零开始在vue-cli4配置自适应vw布局的实现
Jun 08 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/11/11 PHP
php压缩HTML函数轻松实现压缩html/js/Css及注意事项
2013/01/27 PHP
PHP设置一边执行一边输出结果的代码
2013/09/30 PHP
微信支付开发订单查询实例
2016/07/12 PHP
PHP递归获取目录内所有文件的实现方法
2016/11/01 PHP
php使用curl实现简单模拟提交表单功能
2017/05/15 PHP
PHP基于imagick扩展实现合成图片的两种方法【附imagick扩展下载】
2017/11/14 PHP
jquery.validate使用攻略 第一部
2010/07/01 Javascript
jquery $.each() 使用小探
2013/08/23 Javascript
使用jquery组件qrcode生成二维码及应用指南
2015/02/22 Javascript
JS日期格式化之javascript Date format
2015/10/01 Javascript
jQuery zTree加载树形菜单功能
2016/02/25 Javascript
BootStrap中的Fontawesome 图标
2017/05/25 Javascript
Vue Router去掉url中默认的锚点#
2018/08/01 Javascript
Vue通过WebSocket建立长连接的实现代码
2019/11/05 Javascript
Vue使用路由钩子拦截器beforeEach和afterEach监听路由
2020/11/16 Javascript
[02:15]2015国际邀请赛选手档案IG.Ferrari 430
2015/07/30 DOTA
在Python程序员面试中被问的最多的10道题
2017/12/05 Python
pandas实现将dataframe满足某一条件的值选出
2019/06/12 Python
python的命名规则知识点总结
2019/10/04 Python
Python 字典中的所有方法及用法
2020/06/10 Python
python能自学吗
2020/06/18 Python
Python私有属性私有方法应用实例解析
2020/09/15 Python
Visual Studio Code搭建django项目的方法步骤
2020/09/17 Python
Python内存泄漏和内存溢出的解决方案
2020/09/26 Python
使用CSS媒体查询(Media Queries)和JavaScript判断浏览器设备类型的方法
2014/04/03 HTML / CSS
欧洲最大的滑雪假期供应商之一:Sunweb Holidays
2018/01/06 全球购物
End Clothing美国站:英国男士潮牌商城
2018/04/20 全球购物
清扬洗发水广告词
2014/03/14 职场文书
初三学习计划书范文
2014/04/30 职场文书
知识改变命运演讲稿
2014/05/21 职场文书
汽车检测与维修专业求职信
2014/07/04 职场文书
项目委托协议书(最新)
2014/09/13 职场文书
职工的安全责任书范文!
2019/07/02 职场文书
通过Qt连接OpenGauss数据库的详细教程
2021/06/23 PostgreSQL
解析目标检测之IoU
2021/06/26 Python