2011-10-09 89 views

回答

46

V8 design docs暗示查詢將至少這快,如果不是更快:

大多數JavaScript引擎使用類似字典的數據結構 存儲爲對象屬性 - 每個屬性訪問需要一個 動態查找來解析屬性在內存中的位置。這種 方法使得訪問JavaScript中的屬性通常比訪問諸如 Java和Smalltalk之類的編程語言中的實例變量要慢很多 。在這些語言中,實例變量位於由編譯器確定的固定偏移量處的 ,這是由於對象的類定義了固定對象 佈局。訪問只是簡單的內存加載或存儲,通常只需要一條指令。

爲了減少訪問JavaScript屬性所需的時間,V8確實不使用動態查找來訪問屬性。相反,動態V8動態 在幕後創建隱藏類。 [...] 在V8中,當添加新屬性時,對象將更改其隱藏類 。

聽起來像增加一個新的密鑰可能會稍微慢一點,但是,由於隱藏的類創建。

+0

謝謝Domenic!所以對於我來說使用Object查找作爲字典查找似乎是安全的,如果我正在做更多的查找而不是哈希。 –

+0

對於V8,動態查找是不是同時用於點表示法和方括號表示法? –

15

是的,您可以假設添加一個密鑰,並隨後使用它進行訪問有效地是恆定時間操作。在引擎蓋下,JS引擎可能會應用一些技術來優化後續查找,但出於任何算法的目的,您可以假設O(1)。