作为If v8 rehashes when an object grows答案的后续问题,我想知道v8如何实际存储“快速”对象。
答案:
快速模式通常可以更快地进行属性访问 - 但需要知道对象的结构。
V8最初会尝试构建一个对象看起来像“隐藏类”的模板。该对象将通过隐藏类进行转换,直到V8放弃并将对象存储为慢属性。
然后我问对象增长时v8 是否重新,答案是:
根本没有散列 - 它只是内存访问的偏移 - 就像C中的结构一样。
(对于快速模式对象)
它还提到:
在这种情况下,对象根本不存储为哈希映射 - 它是一个隐藏的类
总而言之,即使您更改了对象属性,它仍然是结构化的,因此存在一个隐藏的类:
var x = { a: 1, b: 2, c: 3 }
x.d = 4
x.e = 5
x.f = 6
基于答案,v8实际上并不使用哈希表来存储值,因为它使用隐藏类。所以问题是,v8如何将值实际存储为隐藏的类结构。隐藏的类做什么,它是如何构建的,它是如何工作的。当您稍后在代码中执行var d = 'd'; x[d]
时(只是为了使其动态化),如何在不将d
属性散列为字符串以获取索引的情况下知道d
的值的位置(理论上)。它是如何从密钥中找到结构的内存地址的。