为什么[]通常比new Array()快呢

ethanliang2 2010-01-26 09:58:10
Firebug下:
var i, a;
console.time('s');
for(i = 0; i < 10000; i++) {
a = [];
}
console.timeEnd('s');

console.time('e');
for(i = 0; i < 10000; i++) {
a = new Array();
}
console.timeEnd('e');

结果
s: 20ms
e: 28ms

为什么[]要比new Array()快呢?
...全文
527 37 打赏 收藏 举报
写回复
37 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
watermarkmms 2010-02-01
  • 打赏
  • 举报
回复
[Quote=引用 33 楼 nanjim 的回复:]
你机器有问题,为什么我的机器上测试时是new Array() 比 [] 快 呢
[/Quote]
那是你的电脑和你的大脑一样,进水了
ethanliang2 2010-01-29
  • 打赏
  • 举报
回复
感谢大家的回复~
我单独使用spidermonkey测试也是[]比new Array()快一些,不过差距更小,100000次(firebug里的10倍)才快6ms左右,但一直都是[]比new Array()快,没有颠覆的时候。测出new Array()比[]快的同学,咱们可以再研究一下。
有人推荐用[],有人推荐用new Array()。我之前看到的文章都是说[]好的,因为调用构造函数参数可以传得很古怪,而且[]更快。前几天听google的v8团队交流上说几个js小原则也是推荐用字面量创建。因为不明白为什么更快,所以求助大家。
在网上看到Douglas Crockford的一篇文章讲了这个问题,很有启发,大家有兴趣的话也可以参考下,这是翻译后的文章:
http://ued.taobao.com/blog/2007/05/15/%E4%BD%A0%E7%9C%9F%E7%9A%84%E4%BC%9A%E5%86%99javascript%E5%90%97%EF%BC%9F/
浴火_凤凰 2010-01-28
  • 打赏
  • 举报
回复
还是建议使用new Array,易读性好,因为你的代码不只是给你自己看,有时候会让别人看,
没有学过JS的人他知道[]是数组吗?
再者你循环10000次,才差8ms,这对于人来说根本没有区别。

假如差8s那才是考虑性能的时候。
游园密语 2010-01-28
  • 打赏
  • 举报
回复
你机器有问题,为什么我的机器上测试时是new Array() 比 [] 快 呢
zengtan1021 2010-01-28
  • 打赏
  • 举报
回复
[]都不认识, 那还不好好学习.
打字员 2010-01-27
  • 打赏
  • 举报
回复
不好意思,话说过头了!

不过你想一下,你说的情况,可能出现?

对于一个写程序的人来说,当数组项多达几十上百时,哪个会这样写?
var s = [1, 2, 3...9999];

可读性差,易出错。

最可能的就是想办法循环赋值。。。

所以你那样比较以示 var s = new array(n) 更好是不对的。

再者说,如果比较 [] 和 new Array();

就要在其它条件尽可能一样的前提下才有说服力吧!

你为什么不这样:

var s = new Array(1, 2, 3, ...9999);

var s = [1, 2, 3, ...9999];

当然,我没有发现new Array() 和 [] 比那个更好。

只是习惯写 [], 比较直接而己。
yingzhilian2008 2010-01-27
  • 打赏
  • 举报
回复
console.time()????
wcwtitxu 2010-01-27
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 dh20156 的回复:]
你们的测试意义不大,而且很容易犯下“不要使用大数据的字面量对象”的戒条。

考虑以下代码:

I.使用常规方式创建对象并赋值
JScript code<script type="text/javascript">var a=new Array(70000);for(var i=0;i<a.length;i++){a[i]= i;}
alert(a[a.length-1]);</script>

II.使用字面量对象
JScript code<script type="text/javascript">//由于回复内容字数限制,请大家自行还原以下代码,可以用I的a.join(',')来得到。var a= [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,...,69995,69996,69997,69998,69999];
alert(a[a.length-1]);</script>

当我们使用IE6测试时会发现,II的代码会让IE6报内存不够的错误,而I的代码则可以很好的运行!
[/Quote]

我也认为拿这两段代码作对比,不妥

[e1,e2,e3, ... , en] 就应该和 new Array(e1,e2,e3, ... , en) 对比


------------------------------------------------



var a = new Array(70000);
for(var i=0;i<a.length;i++){a[i] = i;}
alert(a[a.length-1]);

最多只能和下面的代码对比

var a = []; a.length = 7000;
for(var i=0;i<a.length;i++){a[i] = i;}
alert(a[a.length-1]);
dh20156 2010-01-27
  • 打赏
  • 举报
回复
[Quote=引用 29 楼 zengtan1021 的回复:]
我觉得24楼说的很好, 为了证明这个论题, var s = [1, 2, 3...9999]; 只能和 var s = new Array(1,2,3...9999)比较.

dh20156虽然是好意, 但理解力好像有些问题.
[/Quote]

......
zengtan1021 2010-01-27
  • 打赏
  • 举报
回复
我觉得24楼说的很好, 为了证明这个论题, var s = [1, 2, 3...9999]; 只能和 var s = new Array(1,2,3...9999)比较.

dh20156虽然是好意, 但理解力好像有些问题.
itliyi 2010-01-27
  • 打赏
  • 举报
回复
斑竹头像mm不错
dh20156 2010-01-27
  • 打赏
  • 举报
回复
[Quote=引用 24 楼 danica7773 的回复:]
不好意思,话说过头了!

不过你想一下,你说的情况,可能出现?

对于一个写程序的人来说,当数组项多达几十上百时,哪个会这样写?
var s = [1, 2, 3...9999];

可读性差,易出错。
[/Quote]

当这个步骤发生在后端返回数据时是经常会发生的,如果你认为这个数据量大的话,其实很多公司的数据量比这个还要大!

这也是之前一位同事遇到的实际问题,所以我才把它拿出来和大家分享一下,就是希望大家能够对字面量对象有更多一点了解,同勉!
街头小贩 2010-01-27
  • 打赏
  • 举报
回复
字面量和对象相比!字面量一定是比对象快的!应该在所有语言中都通用吧(至少我知道的是这样)
garcon1986 2010-01-27
  • 打赏
  • 举报
回复
帮顶~~~
duwa789 2010-01-26
  • 打赏
  • 举报
回复
学习学习
yixianggao 2010-01-26
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 warison2008 的回复:]
无意义的对比
[/Quote]
呵呵,此言差矣,至少说明 lz 是个很细心的人,

而【用心对待代码】恰恰是专业程序员最重要的基本素质!
KK3K2005 2010-01-26
  • 打赏
  • 举报
回复
因为 '[]' 的代码长度比 ‘new Array()’的长度短 哈哈
yixianggao 2010-01-26
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 xuyiazl 的回复:]
个人习惯问题,不过个人还是比较喜欢用[]的。直观明了,而且效果略高。只是新手不知道两者的区别而已。

我看过很多老外的代码  都是使用[]的。而国内大部分都是实例Array.

从效率的角度上考虑并非是习惯问题了,而是新手与老手之间的问题了。
[/Quote]
呵呵,老外也是人,是人就喜欢偷懒滴,因此喜欢写 [],偷懒无国界!

至于从效率的角度上问题,菜鸟只会简单考虑效率,而专业人员会综合考虑效率问题!
yixianggao 2010-01-26
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 jiewenxu 的回复:]
很简单,Array()是一个对象,[]是一个数据原型。使用new Array()系统每次都会新生成一个对象(浏览器每生成一个对象都会耗费资源去构造他的属性和方法),他的子集是[];

个人推荐使用[],效率高。浏览器对于CPU很吃紧,所以很多时候要有技巧。比如数字转换成字符只要a=a+'';就可以了,比用String效率高了很多。但是如果乱用是会造成错误的
[/Quote]
呵呵,与其说是技巧,不如说是诡计!

各种语言的设计者何尝不是编程高手、编译专家,难道他们不懂得如何提高执行效率么?!!

那么为什么还会设计出那些“效率低下”的方法呢?!!

原因只有一个,代码是程序员写出来的,因此程序语言要更易于程序员理解,才能提高工作效率!

【代码的易读性和可维护性】与【代码的执行效率】之间要找到恰当的平衡点,
如果为了提高【代码的执行效率】而降低了【代码的易读性和可维护性】常常是得不偿失滴!
道光2008 2010-01-26
  • 打赏
  • 举报
回复
无意义的对比
加载更多回复(16)
相关推荐
发帖
JavaScript

8.7w+

社区成员

Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
帖子事件
创建了帖子
2010-01-26 09:58
社区公告
暂无公告