JavaScriptV8引擎中的Map.get(obj)是如何实现对象查找的?

JavaScriptV8引擎中的Map.get(obj)是如何实现对象查找的?,javascript,dictionary,v8,es6-map,Javascript,Dictionary,V8,Es6 Map,我很好奇v8的内部结构以及Map是如何在引擎盖下实现的。与映射相反,javascript对象不能将对象作为键。据我所知,Maps以经典的哈希映射方式实现查找。一些散列函数将输入键映射到某个输出整数,该整数用作数组中的索引。然后,当数组溢出时,会动态调整大小,数组的每个bin中都会有一些linkedlist。可能v8地图的细节更复杂一些,它们涉及一些针对小型Maps的优化?很想知道实际的实现与我上面的草图有多大的不同。假设Map在引擎盖下是这样工作的,那么它如何从一个普通对象映射到数组中的一个键呢

我很好奇v8的内部结构以及
Map
是如何在引擎盖下实现的。与映射相反,javascript对象不能将对象作为键。据我所知,
Map
s以经典的哈希映射方式实现查找。一些散列函数将输入键映射到某个输出整数,该整数用作数组中的索引。然后,当数组溢出时,会动态调整大小,数组的每个bin中都会有一些linkedlist。可能v8地图的细节更复杂一些,它们涉及一些针对小型
Map
s的优化?很想知道实际的实现与我上面的草图有多大的不同。假设
Map
在引擎盖下是这样工作的,那么它如何从一个普通对象映射到数组中的一个键呢?我猜它将指针地址模化到数组中

很想深入挖掘。

简短的回答:(稍作更新:四年后,随机“散列”存储在对象上的精确方式确实有所改进;原理保持不变)


详细回答:正如Bergi所建议的,阅读源代码。请注意,细节可能随时发生变化(这也是为什么没有大量关于当前实现的文档的原因之一)。

如果您对具体细节非常感兴趣,是否查看了代码?没有,但公平地说,我可能会认为此文件更相关。我链接的上一个文件与所有对象AFAIC更相关。太棒了,谢谢@jmrk!我已经尽了最大努力通读了资料来源。AFICS,
JsMap
扩展了
OrderedHashMap
OrderedHashMap::GetHash
,调用
Object::GetHash->JSReceiver::GetIdentityHash->GetIdentityHashHelper->BaseNameDictionary::Hash
,获取存储在对象
kObjectHashIndex
中固定偏移量处的随机哈希。这听起来是对的吗?当然,除了跳过一大堆细节外,这个总结听起来是对的。另一种总结方法是“对象的哈希存储在对象上”。