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 相关文章推荐
JS 建立对象的方法
Apr 21 Javascript
js截取固定长度的中英文字符的简单实例
Nov 22 Javascript
调整小数的格式保留小数点后两位
May 14 Javascript
详述JavaScript实现继承的几种方式(推荐)
Mar 22 Javascript
BootStrap点击下拉菜单项后显示一个新的输入框实现代码
May 16 Javascript
Javascript 6里的4个新语法
Aug 25 Javascript
使用ionic在首页新闻中应用到的跑马灯效果的实现方法
Feb 13 Javascript
JavaScript中三种常见的排序方法
Feb 24 Javascript
JS中精巧的自动柯里化实现方法
Dec 12 Javascript
JavaScript学习教程之cookie与webstorage
Jun 23 Javascript
详解Jest结合Vue-test-utils使用的初步实践
Jun 27 Javascript
js实现点击图片在屏幕中间弹出放大效果
Sep 11 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
Yii框架form表单用法实例
2014/12/04 PHP
在php中设置session用memcache来存储的方法总结
2016/01/14 PHP
在PHP语言中使用JSON和将json还原成数组的方法
2016/07/19 PHP
Laravel5.* 打印出执行的sql语句的方法
2017/07/24 PHP
Laravel模型事件的实现原理详解
2018/03/14 PHP
cnblogs中在闪存中屏蔽某人的实现代码
2010/11/14 Javascript
如何用jquery控制表格奇偶行及活动行颜色
2014/04/20 Javascript
JQuery中的事件及动画用法实例
2015/01/26 Javascript
JS实现让网页背景图片斜向移动的方法
2015/02/25 Javascript
JS递归遍历对象获得Value值方法技巧
2016/06/14 Javascript
js实现PC端和移动端刮卡效果
2020/03/27 Javascript
jQuery图片加载失败替换默认图片方法汇总
2017/11/29 jQuery
AngularJs中$cookies简单用法分析
2019/05/30 Javascript
keep-alive保持组件状态的方法
2020/12/02 Javascript
python统计cpu利用率的方法
2015/06/02 Python
Python实现PS滤镜碎片特效功能示例
2018/01/24 Python
对numpy和pandas中数组的合并和拆分详解
2018/04/11 Python
浅析python中numpy包中的argsort函数的使用
2018/08/30 Python
结合OpenCV与TensorFlow进行人脸识别的实现
2019/10/10 Python
python3 dict ndarray 存成json,并保留原数据精度的实例
2019/12/06 Python
详解python tkinter模块安装过程
2020/01/06 Python
Python中文分词库jieba,pkusegwg性能准确度比较
2020/02/11 Python
pycharm无法安装第三方库的问题及解决方法以scrapy为例(图解)
2020/05/09 Python
Python 操作SQLite数据库的示例
2020/10/16 Python
Python安装Bs4的多种方法
2020/11/28 Python
深入浅析css3 border-image边框图像详解
2015/11/24 HTML / CSS
html5 canvas 简单画板实现代码
2012/01/05 HTML / CSS
Carter’s官方旗舰店:美国受欢迎的婴童服装品牌
2018/01/21 全球购物
美国在线咖啡、茶和餐厅供应商:LollicupStore
2018/05/04 全球购物
幼儿园社区活动总结
2014/07/07 职场文书
2015廉洁自律个人总结
2015/02/14 职场文书
企业计划生育责任书
2015/05/09 职场文书
Python 发送SMTP邮件的简单教程
2021/06/24 Python
python编程学习使用管道Pipe编写优化代码
2021/11/20 Python
css3中2D转换之有趣的transform形变效果
2022/02/24 HTML / CSS