2011-10-09 53 views

回答

46

V8 design docs暗示查询将至少这快,如果不是更快:

大多数JavaScript引擎使用类似字典的数据结构 存储为对象属性 - 每个属性访问需要一个 动态查找来解析属性在内存中的位置。这种 方法使得访问JavaScript中的属性通常比访问诸如 Java和Smalltalk之类的编程语言中的实例变量要慢很多 。在这些语言中,实例变量位于由编译器确定的固定偏移量处的 ,这是由于对象的类定义了固定对象 布局。访问只是简单的内存加载或存储,通常只需要一条指令。

为了减少访问JavaScript属性所需的时间,V8确实不使用动态查找来访问属性。相反,动态V8动态 在幕后创建隐藏类。 [...] 在V8中,当添加新属性时,对象将更改其隐藏类 。

听起来像增加一个新的密钥可能会稍微慢一点,但是,由于隐藏的类创建。

+0

谢谢Domenic!所以对于我来说使用Object查找作为字典查找似乎是安全的,如果我正在做更多的查找而不是哈希。 –

+0

对于V8,动态查找是不是同时用于点表示法和方括号表示法? –

15

是的,您可以假设添加一个密钥,并随后使用它进行访问有效地是恒定时间操作。在引擎盖下,JS引擎可能会应用一些技术来优化后续查找,但出于任何算法的目的,您可以假设O(1)。