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下function声明一些小结
Dec 28 Javascript
基于JQuery.timer插件实现一个计时器
Apr 25 Javascript
基于jQuery架构javascript基础体系
Jan 01 Javascript
克隆javascript对象的三个方法小结
Jan 12 Javascript
javaScript年份下拉列表框内容为当前年份及前后50年
May 28 Javascript
JavaScript字符串对象substr方法入门实例(用于截取字符串)
Oct 16 Javascript
javascript 的变量、作用域和内存问题
Apr 19 Javascript
JS实现延迟隐藏功能的方法(类似QQ头像鼠标放上展示信息)
Dec 28 Javascript
原生JS实现动态加载js文件并在加载成功后执行回调函数的方法
Dec 30 Javascript
elementUI 动态生成几行几列的方法示例
Jul 11 Javascript
使用vue引入maptalks地图及聚合效果的实现
Aug 10 Javascript
什么是SOLID
Mar 24 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
实现分十页分向前十页向后十页的处理
2006/10/09 PHP
Ajax+PHP 边学边练 之二 实例
2009/11/24 PHP
php随机显示图片的简单示例
2014/02/15 PHP
ThinkPHP中RBAC类的四种用法分析
2014/11/24 PHP
PHP实现网页内容html标签补全和过滤的方法小结【2种方法】
2017/04/27 PHP
php-fpm重启导致的程序执行中断问题详解
2019/04/29 PHP
让alert不出现弹窗的两种方法
2014/05/18 Javascript
javaScript年份下拉列表框内容为当前年份及前后50年
2014/05/28 Javascript
AngularJs入门教程之环境搭建+创建应用示例
2016/11/01 Javascript
React Router基础使用
2017/01/17 Javascript
JS实现简易换图时钟功能分析
2018/01/04 Javascript
利用vue重构有赞商城的思路以及总结整理
2019/02/21 Javascript
Vue.js 无限滚动列表性能优化方案
2019/12/02 Javascript
ElementUI Tree 树形控件的使用并给节点添加图标
2020/02/27 Javascript
Vue记住滚动条和实现下拉加载的完美方法
2020/07/31 Javascript
vue-cli脚手架的.babelrc文件用法说明
2020/09/11 Javascript
[51:17]VGJ.T vs Mineski 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
python读取html中指定元素生成excle文件示例
2014/04/03 Python
Python爬虫框架Scrapy实战之批量抓取招聘信息
2015/08/07 Python
python框架django基础指南
2016/09/08 Python
Python存取XML的常见方法实例分析
2017/03/21 Python
Python基于ThreadingTCPServer创建多线程代理的方法示例
2018/01/11 Python
Django中使用第三方登录的示例代码
2018/08/20 Python
Django实现一对多表模型的跨表查询方法
2018/12/18 Python
python opencv调用笔记本摄像头
2019/08/28 Python
Python中six模块基础用法
2019/12/08 Python
Python request操作步骤及代码实例
2020/04/13 Python
HTML5之消息通知的使用(Web Notification)
2018/10/30 HTML / CSS
中年人生感言
2014/02/04 职场文书
公司司机岗位职责
2014/02/07 职场文书
行政管理毕业生自荐信
2014/02/24 职场文书
党的群众路线教育实践活动总结报告
2014/07/03 职场文书
小学六一儿童节活动方案
2014/08/27 职场文书
无罪辩护词范文
2015/05/21 职场文书
新手入门Jvm-- JVM对象创建与内存分配机制
2021/06/18 Java/Android
进行数据处理的6个 Python 代码块分享
2022/04/06 Python