2012-02-01 85 views
6

下面的代码(i)和(ii)之间有什么区别?使用。或[]来访问对象属性 - 有什么区别?

(I)

var obj:Object = new Object(); 
obj.attribute = value ; 

(II)

var obj:Object = new Object(); 
obj["key"] = value; 

是否有任何运行时间的影响,如果我这样写:

var obj:Object = new Object(); 
obj.somekey = value1 ; 
obj["someKey"] = value2 ; 

请解释。

回答

21

区别在于查找机制:如果使用点语法,编译器将在编译时知道您正在访问该对象的属性。如果使用括号语法,则实际查找属性是在运行时完成的,并且必须进行更多类型检查 - 毕竟,您可以动态组合键字符串,值可能会更改,或者您甚至可以调用函数而不是变量等。

结果是性能上的显着差异:括号语法的执行时间大约是点语法的三倍。

这里有一个小速度测试来说明我的观点:

var start : int = getTimer(); 

var obj:Object = { something : "something" }; 

for (var i : int = 0; i < 100000000; i++) { 
    var n:String = obj.something; 
} 

trace ("Time with dot syntax: "+(getTimer() - start)); 

start = getTimer(); 

for (i = 0; i < 100000000; i++) { 
    var o:String = obj["something"]; 
} 

trace ("Time with bracket syntax: "+(getTimer() - start)); 

如果两者是相同的,除了符号,他们应该采取准确的时间相同。但正如你所看到的,情况并非如此。在我的机器上:

Time with dot syntax:  3937 
Time with bracket syntax: 9857 
+0

谢谢,很好的覆盖 – 2012-02-01 15:11:26

+2

基准的奖励点! – 2012-02-01 15:32:22