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 相关文章推荐
HTA版JSMin(省略修饰语若干)基于javascript语言编写
Dec 24 Javascript
jquery lazyload延迟加载技术的实现原理分析
Jan 24 Javascript
浅谈Javascript事件处理程序的几种方式
Jun 27 Javascript
解决jquery插件冲突的问题
Jan 23 Javascript
Jquery Ajax解析XML数据(同步及异步调用)简单实例
Feb 12 Javascript
JS设置下拉列表框当前所选值的方法
Dec 22 Javascript
Bootstrap Table 在指定列中添加下拉框控件并获取所选值
Jul 31 Javascript
webpack+vue-cil中proxyTable处理跨域的方法
Jul 20 Javascript
JS二级菜单不同实现方法分析【4种方法】
Dec 21 Javascript
详解JavaScript修改注册表的方法
Jan 05 Javascript
如何解决jQuery 和其他JS库的冲突
Jun 22 jQuery
解决vue组件没显示,没起作用,没报错,但该显示的组件没显示问题
Sep 02 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实现批量删除数据的代码实例
2014/07/02 PHP
php实现背景图上添加圆形logo图标的方法
2016/11/17 PHP
Laravel中日期时间处理包Carbon的简单使用
2017/09/21 PHP
php微信公众号开发之现金红包
2018/04/16 PHP
PHP实现数据库的增删查改功能及完整代码
2018/04/18 PHP
用javascript动态调整iframe高度的代码
2007/04/10 Javascript
js获取图片长和宽度的代码
2009/11/24 Javascript
toString()一个会自动调用的方法
2010/02/08 Javascript
JavaScript eval() 函数介绍及应用示例
2014/07/29 Javascript
使用jQuery实现图片遮罩半透明坠落遮挡
2015/03/16 Javascript
Vue.JS入门教程之事件监听
2016/12/01 Javascript
javascript 中的try catch应用总结
2017/04/01 Javascript
Bootstrap Table使用整理(四)之工具栏
2017/06/09 Javascript
JavaScript之class继承_动力节点Java学院整理
2017/07/03 Javascript
jQuery动态添加元素无法触发绑定事件的解决方法分析
2018/01/02 jQuery
代码详解javascript模块加载器
2018/03/04 Javascript
基于vue2.0动态组件及render详解
2018/03/17 Javascript
nodejs高大上的部署方式(PM2)
2018/09/11 NodeJs
checkbox在vue中的用法小结
2018/11/13 Javascript
微信小程序非跳转式组件授权登录的方法示例
2019/05/22 Javascript
JavaScript原型式继承实现方法
2019/11/06 Javascript
[48:31]完美世界DOTA2联赛PWL S3 DLG vs Phoenix 第二场 12.17
2020/12/19 DOTA
使用Python开发SQLite代理服务器的方法
2018/12/07 Python
详解python实现交叉验证法与留出法
2019/07/11 Python
Python及Pycharm安装方法图文教程
2019/08/05 Python
Django框架 查询Extra功能实现解析
2019/09/04 Python
Python字符串hashlib加密模块使用案例
2020/03/10 Python
西班牙第一的网上药房:PromoFarma.com
2017/04/17 全球购物
网吧消防安全制度
2014/01/28 职场文书
劳动竞赛口号
2014/06/16 职场文书
大学生年度个人总结
2015/02/15 职场文书
管理者们如何制定2019年的工作计划?
2019/07/01 职场文书
2019最新婚庆对联集锦!
2019/07/10 职场文书
SQL Server数据定义——模式与基本表操作
2021/04/05 SQL Server
Vue+Element UI实现概要小弹窗的全过程
2021/05/30 Vue.js
Android Gradle 插件自定义Plugin实现注意事项
2022/06/16 Java/Android