2012-02-01 26 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