2013-09-23 14 views
0
var obj = {}; 

Object.defineProperty(this, 'foo', void (obj.value = 0) || obj); 
Object.defineProperty(this, 'foo2', void (obj.value = 1) || obj); 

Object.defineObject,再用对象或对象的文字符号

Object.defineProperty(this, 'foo', {value:0}); 
Object.defineProperty(this, 'foo2', {value:1}); 


似乎都只是作为快速运行,但将前者是GC更好吗?

+3

我不确定你在做什么...... – Neal

+0

你的问题到底是什么? – Bucket

+0

'void whatever || obj'总是返回'obj',因为'void whatever'总是未定义的。 – bfavaretto

回答

1

选项B创建两个临时对象,而选项A只创建一个。然而,选项B中的临时对象可以立即适用于GC,并且理论上可以比选项A中的临时对象更容易优化,该选项一直存在,直到您声明它的块的末尾为止。

在表现上几乎没有实际的差异;在这个级别摆弄是过早的优化(并且通常不可能在所有浏览器中选择最快的版本)。你应该选择B,这是更具可读性和惯用的JavaScript。对于我来说(在Ubuntu 13.04 64位上),测试10万次运行超过5次尝试导致在Firefox或Chrome中不会一直更快(即随机噪声大于任何性能差异)。

+0

这不是过早的优化(我已经写完了所有内容,现在我正在尝试针对移动设备进行优化)。上面的代码是一个sudo示例,obj将被存储为全局变量,并且为了这个目的将在整个代码库中重用。我做了性能测试,第一种方法实际上比第二种方法快,但我更关心gc。 gc似乎导致手机放缓,这就是为什么我想要做这样的优化。所以,假设我一遍又一遍地使用这个对象,会更好吗? – user2800679

+0

http://jsperf.com/testttttttt3333 – user2800679

+0

保留一个具有一个属性的全局对象作为文档生命周期在GC上完全没有应变。但是让代码不易读取以适应它是非常不合理的。难以仅用伪例子进行更详细的判断;对于这个例子,如果不使用'Object.defineProperty',显然会更好,导致百倍加速... – bobince