RT
javascriptvar a = {}; var b = new Object();
javascript
var a = {}; var b = new Object();
这两种创建对象方式的区别是什么?
=====
的确从测试效果来看,{}会快一点。但是为什么{}会比new Object()快呢?
{}
new Object()
光阴似箭催人老,日月如移越少年。
{} 这个叫做对象字面量
对象字面量
如果new Object()中没有传入参数,与{}是一样的。 但是如果传入不同的参数,会有不同的效果。
String
new String()
Number
new Number()
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}
new Vec(1, 1)
new Obj; o.a = 1; o.b = 1;
{a: 1, b: 1}
注:以上測試平臺均爲 chrome
看樣子不同瀏覽器差異很大,不過 new Object 和對象字面量一如既往地慢倒是不爭的事實。
最穩妥的方案目前是 new Vec(1, 2)
new Vec(1, 2)
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链中遍历该方法,当找到该方法后,又会生产方法调用必须的堆栈信息,方法调用结束后,还要释放该堆栈
也许楼主可以测试一下new Array()和new Object()之间哪个更快。 很多人都说了new Object()的具体类型需要看传入的参数,这间接说明了在构造时需要额外的逻辑进行类型转换,而{}, new Array(), new Date()则是已知类型,无需转换,因此可证。
求教楼主怎么用浏览器测试速度,我百度,Google没找到
一个字符长一点,一个短一点, 其他的没差。
如果是 new String() 和 "" 等其他的还是略有差别的。
这两个没啥差别。
javascriptvar foo = ''; var bar = new String();
var foo = ''; var bar = new String();
这样的有差别。
另外:
javascriptvar foo = new Object(); var bar = Object.create(null);
var foo = new Object(); var bar = Object.create(null);
这俩有差别。
在初始化时是有区别的:
var b = new Object()
是构造函数实例化对象。
var a = {}
是直接创建JSON对象,第二种初始化时较方便,可以同时赋值; 两者创建的对象在使用上都一样。类似于:
var arr = new Array(); var arr = [];
都是定义数组,第二种可以直接初始化,效率较高,还能减小JS文件体积。 参考自:http://zhidao.baidu.com/question/539918199.html
{}
这个叫做对象字面量
如果
new Object()
中没有传入参数,与{}
是一样的。但是如果传入不同的参数,会有不同的效果。
String
返回String
,类似new String()
Number
返回Number
,类似new Number()
Object
返回Object
,其实没啥用当然还有其他的,比如传入数组等等~基本都是返回传入的类型,并且传入前后的对象是不变的,也就是不会进行一次拷贝。也就是如下代码
也就是如上的效果
實驗缺乏對照組。
這樣纔可以。結果 c 遠快於 a 和 b,a 略快於 b。
然而
new Vec(1, 1)
快於new Obj; o.a = 1; o.b = 1;
和{a: 1, b: 1}
注:以上測試平臺均爲 chrome
看樣子不同瀏覽器差異很大,不過 new Object 和對象字面量一如既往地慢倒是不爭的事實。
最穩妥的方案目前是
new Vec(1, 2)
输出依次为:
上面的代码为在node中的运行结果,node基于v8;firefox的SpiderMonkey结果类似。
至于为什么
{}
比new Object()
快,我觉得主要原因是:也许楼主可以测试一下new Array()和new Object()之间哪个更快。
很多人都说了new Object()的具体类型需要看传入的参数,这间接说明了在构造时需要额外的逻辑进行类型转换,而{}, new Array(), new Date()则是已知类型,无需转换,因此可证。
求教楼主怎么用浏览器测试速度,我百度,Google没找到
一个字符长一点,一个短一点, 其他的没差。
如果是 new String() 和 "" 等其他的还是略有差别的。
这两个没啥差别。
这样的有差别。
另外:
这俩有差别。
在初始化时是有区别的:
是构造函数实例化对象。
是直接创建JSON对象,第二种初始化时较方便,可以同时赋值; 两者创建的对象在使用上都一样。类似于:
都是定义数组,第二种可以直接初始化,效率较高,还能减小JS文件体积。
参考自:http://zhidao.baidu.com/question/539918199.html