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后$冲突的解决办法
Jul 09 Javascript
Javascript call和apply区别及使用方法
Nov 14 Javascript
jquery $(&quot;#variable&quot;) 循环改变variable的值示例
Feb 23 Javascript
javascript学习总结之js使用技巧
Sep 02 Javascript
JavaScript中iframe实现局部刷新的几种方法汇总
Jan 06 Javascript
利用Angularjs和bootstrap实现购物车功能
Aug 31 Javascript
ES6中Array.copyWithin()函数的用法实例详解
Sep 16 Javascript
React-router4路由监听的实现
Aug 07 Javascript
自定义Vue中的v-module双向绑定的实现
Apr 17 Javascript
countUp.js实现数字滚动效果
Oct 18 Javascript
ES6常用小技巧总结【去重、交换、合并、反转、迭代、计算等】
Dec 21 Javascript
如何编写一个 Webpack Loader的实现
Oct 18 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
php的access操作类
2008/04/09 PHP
PHP实现的文件上传类与用法详解
2017/07/05 PHP
thinkphp5.1框架容器与依赖注入实例分析
2019/07/23 PHP
laravel执行php artisan migrate报错的解决方法
2019/10/09 PHP
制作特殊字的脚本
2006/06/26 Javascript
javascript背投广告代码的完善
2008/04/08 Javascript
遨游,飞飞,IE,空中网 浏览器无提示关闭方法
2011/07/11 Javascript
jquery 添加节点的几种方法介绍
2013/09/04 Javascript
js 数组去重的四种实用方法
2014/09/09 Javascript
微信端开发--登录小程序步骤
2017/01/11 Javascript
微信小程序图片横向左右滑动案例
2017/05/19 Javascript
解决webpack -p压缩打包react报语法错误的方法
2017/07/03 Javascript
vue中使用cropperjs的方法
2018/03/01 Javascript
jQuery实现鼠标点击处心形漂浮的炫酷效果示例
2018/04/12 jQuery
浅析Vue 生命周期
2018/06/21 Javascript
解决layer.open后laydate失效的问题
2019/09/06 Javascript
JavaScript中reduce()的5个基本用法示例
2020/07/19 Javascript
[02:07]TI9显影之尘系列 - Vici Gaming
2019/08/20 DOTA
[52:39]完美世界DOTA2联赛PWL S3 CPG vs Forest 第一场 12.16
2020/12/17 DOTA
Django卸载之后重新安装的方法
2017/03/15 Python
浅谈Python中的作用域规则和闭包
2018/03/20 Python
将Python字符串生成PDF的实例代码详解
2019/05/17 Python
使用Python画股票的K线图的方法步骤
2019/06/28 Python
python flask框架实现重定向功能示例
2019/07/02 Python
python 初始化一个定长的数组实例
2019/12/02 Python
pytorch下大型数据集(大型图片)的导入方式
2020/01/08 Python
python绘图模块之利用turtle画图
2021/02/12 Python
html5使用Canvas绘图的使用方法
2017/11/21 HTML / CSS
大学生入党自我鉴定
2013/10/31 职场文书
教师先进工作者事迹材料
2014/05/01 职场文书
2014年宣传部工作总结
2014/11/12 职场文书
导游词之澳门妈祖庙
2019/12/19 职场文书
教你用Python写一个植物大战僵尸小游戏
2021/04/25 Python
MySQL 四种连接和多表查询详解
2021/07/16 MySQL
Java基础——Map集合
2022/04/01 Java/Android