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 相关文章推荐
Jquery Ajax学习实例5 向WebService发出请求,返回泛型集合数据的异步调用
Mar 17 Javascript
jquery eval解析JSON中的注意点介绍
Aug 23 Javascript
javascript利用apply和arguments复用方法
Nov 25 Javascript
Javascript中使用parseInt函数需要注意的问题
Apr 02 Javascript
JavaScript实现图片轮播的方法
Jul 31 Javascript
js H5 canvas投篮小游戏
Aug 18 Javascript
关于vue面试题汇总
Mar 20 Javascript
JS对象与json字符串相互转换实现方法示例
Jun 14 Javascript
layer关闭当前窗口页面以及确认取消按钮的方法
Sep 09 Javascript
使用layer弹窗提交表单时判断表单是否输入为空的例子
Sep 26 Javascript
详解如何在Vue项目中发送jsonp请求
Oct 25 Javascript
JS实现简单九宫格抽奖
Jun 28 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投票程序源码
2007/03/11 PHP
ThinkPHP访问不存在的模块跳转到404页面的方法
2014/06/19 PHP
经典海量jQuery插件 大家可以收藏一下
2010/02/07 Javascript
获取服务器传来的数据 用JS去空格的正则表达式
2012/03/26 Javascript
左右悬浮可分组的网站QQ在线客服代码(可谓经典)
2012/12/21 Javascript
有关于JS辅助函数inherit()的问题
2013/04/07 Javascript
Jquery时间验证和转换工具小例子
2013/07/01 Javascript
jqGrid随窗口大小变化自适应大小的示例代码
2013/12/28 Javascript
js登录弹出层特效
2014/03/07 Javascript
jQuery+ajax实现鼠标单击修改内容的思路
2014/06/29 Javascript
使用jQuery获得内容以及内容的属性
2015/02/26 Javascript
在JavaScript中处理数组之reverse()方法的使用
2015/06/09 Javascript
Javascript中的作用域和上下文深入理解
2015/07/03 Javascript
js插件dropload上拉下滑加载数据实例解析
2016/07/27 Javascript
jQuery绑定事件的四种方式介绍
2016/10/31 Javascript
Bootstrap table使用方法详细介绍
2016/12/09 Javascript
AngularJS自定义指令详解(有分页插件代码)
2017/06/12 Javascript
修改UA在PC中访问只能在微信中打开的链接方法
2017/11/27 Javascript
对vue中v-if的常见使用方法详解
2018/09/28 Javascript
微信小程序实现多选功能
2018/11/04 Javascript
fetch 如何实现请求数据
2018/12/20 Javascript
Vue动态修改网页标题的方法及遇到问题
2019/06/09 Javascript
JavaScript实现音乐导航效果
2020/11/19 Javascript
Python实现的概率分布运算操作示例
2017/08/14 Python
Python随机生成均匀分布在单位圆内的点代码示例
2017/11/13 Python
浅谈Python中的作用域规则和闭包
2018/03/20 Python
浅析Python数据处理
2018/05/02 Python
python输入整条数据分割存入数组的方法
2018/11/13 Python
python用win32gui遍历窗口并设置窗口位置的方法
2019/07/26 Python
基于Keras的格式化输出Loss实现方式
2020/06/17 Python
孕妇内衣和胸罩:Cake Maternity
2018/07/16 全球购物
自我评价200字分享
2013/12/17 职场文书
家长意见书
2015/06/04 职场文书
go语言基础 seek光标位置os包的使用
2021/05/09 Golang
深入理解CSS 中 transform matrix矩阵变换问题
2021/08/30 HTML / CSS
HTML怎么设置下划线?html文字加下划线方法
2021/12/06 HTML / CSS