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 相关文章推荐
常用参考资料(手册)下载或者链接
Jul 22 Javascript
js小技巧--自动隐藏红叉叉
Aug 13 Javascript
Js callBack 返回前一页的js方法
Nov 30 Javascript
javascript 异常处理使用总结
Jun 21 Javascript
location.href 在IE6中不跳转的解决方法与推荐使用代码
Jul 08 Javascript
javascript 文本框水印/占位符(watermark/placeholder)实现方法
Jan 15 Javascript
Web程序员必备的7个JavaScript函数
Jun 14 Javascript
Bootstrap响应式侧边栏改进版
Sep 17 Javascript
javascript 秒表计时器实现代码
Mar 09 Javascript
浅谈webpack 自动刷新与解析
Apr 09 Javascript
使用 js 简单的实现 bind、call 、aplly代码实例
Sep 07 Javascript
vue动态禁用控件绑定disable的例子
Oct 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
JpGraph php柱状图使用介绍
2011/08/23 PHP
PHP汉字转换拼音的函数代码
2015/12/30 PHP
PHP入门教程之自定义函数用法详解(创建,调用,变量,参数,返回值等)
2016/09/11 PHP
Js 随机数产生6位数字
2010/05/13 Javascript
javascript中检测变量的类型的代码
2010/12/28 Javascript
jquery利用event.which方法获取键盘输入值的代码
2011/10/09 Javascript
用js实现trim()的解决办法
2013/04/16 Javascript
鼠标左键单击冲突的问题解决方法(防止冒泡)
2014/05/14 Javascript
Clipboard.js 无需Flash的JavaScript复制粘贴库
2015/10/02 Javascript
JavaScript获取URL中参数querystring的方法详解
2016/10/11 Javascript
Express使用html模板的详细代码
2017/09/18 Javascript
原生nodejs使用websocket代码分享
2018/04/07 NodeJs
js中位运算的运用实例分析
2018/12/11 Javascript
原生js实现五子棋游戏
2020/05/28 Javascript
React Native登录之指纹登录篇的示例代码
2020/11/03 Javascript
JavaScript canvas实现跟随鼠标移动小球
2021/02/09 Javascript
[34:41]夜魇凡尔赛茶话会 第二期02:你画我猜
2021/03/11 DOTA
用pywin32实现windows模拟鼠标及键盘动作
2014/04/22 Python
Python基于matplotlib绘制栈式直方图的方法示例
2017/08/09 Python
Python cookbook(数据结构与算法)从任意长度的可迭代对象中分解元素操作示例
2018/02/13 Python
python 将json数据提取转化为txt的方法
2018/10/26 Python
python创建学生管理系统
2019/11/22 Python
python实现xlwt xlrd 指定条件给excel行添加颜色
2020/07/14 Python
CSS3实现大小不一的粒子旋转加载动画
2016/04/21 HTML / CSS
css3实现文字首尾衔接跑马灯的示例代码
2020/10/16 HTML / CSS
纬创Java面试题笔试题
2014/10/02 面试题
大学军训感言400字
2014/03/11 职场文书
学雷锋先进个人事迹
2014/05/26 职场文书
邮政竞聘演讲稿
2014/09/03 职场文书
污水处理保证书
2015/05/09 职场文书
工程款申请报告
2015/05/15 职场文书
2016年离婚协议书范文
2016/03/18 职场文书
OpenCV全景图像拼接的实现示例
2021/06/05 Python
Python Flask请求扩展与中间件相关知识总结
2021/06/11 Python
JavaScript 数组去重详解
2021/09/15 Javascript
AudioContext 实现音频可视化(web技术分享)
2022/02/24 Javascript