js:{}与new Object()的区别是什么?

RT

javascriptvar a = {};
var b = new Object();

这两种创建对象方式的区别是什么?

=====

的确从测试效果来看,{}会快一点。但是为什么{}会比new Object()快呢?

阅读 31.7k
8 个回答

{} 这个叫做对象字面量

如果new Object()中没有传入参数,与{}是一样的。
但是如果传入不同的参数,会有不同的效果。

  • 传入String 返回String,类似new String()
  • 传入Number 返回Number,类似new Number()
  • 传入Object 返回Object,其实没啥用

当然还有其他的,比如传入数组等等~基本都是返回传入的类型,并且传入前后的对象是不变的,也就是不会进行一次拷贝。也就是如下代码

var a = {test:1};
var b = new Object(a);
a == b;
// true

也就是如上的效果

實驗缺乏對照組。

var Obj = function() {};

var a = {};
var b = new Object();
var c = new Obj();

這樣纔可以。結果 c 遠快於 a 和 b,a 略快於 b。

然而

var Vec = function(a, b) { this.a = a; this.b = b; }

new Vec(1, 1) 快於 new Obj; o.a = 1; o.b = 1;{a: 1, b: 1}

注:以上測試平臺均爲 chrome

看樣子不同瀏覽器差異很大,不過 new Object 和對象字面量一如既往地慢倒是不爭的事實。

最穩妥的方案目前是 new Vec(1, 2)

也许楼主可以测试一下new Array()和new Object()之间哪个更快。
很多人都说了new Object()的具体类型需要看传入的参数,这间接说明了在构造时需要额外的逻辑进行类型转换,而{}, new Array(), new Date()则是已知类型,无需转换,因此可证。

limit = 10000000000;
s=new Date().getTime()
for(i=0;i<limit;i++) {
    var a = new Object()
}
end=new Date().getTime()
console.log(end-s);

s=new Date().getTime()
for(i=0;i<limit;i++) {
    var a = {}
}
end=new Date().getTime()
console.log(end-s);

输出依次为:

508611
280346

上面的代码为在node中的运行结果,node基于v8;firefox的SpiderMonkey结果类似。

至于为什么{}new Object()快,我觉得主要原因是:

{}是字面量,可以立即求值,而new Object()本质上是方法(只不过这个方法是内置的)调用,既然是方法调用,就涉及到在proto链中遍历该方法,当找到该方法后,又会生产方法调用必须的堆栈信息,方法调用结束后,还要释放该堆栈

求教楼主怎么用浏览器测试速度,我百度,Google没找到

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题