我想知道对象是如何在 Javascript 引擎(V8、Spidermonkey 等)中实现的。它们真的只是哈希表吗?如果是这样,他们如何处理冲突?
最佳答案
首先,对于不同的 JS 引擎,答案可能会有所不同。另外,我假设您专门询问属性(property)存储;显然对象也有一堆其他状态(原型(prototype)链是一个明显的状态)。
就 Spidermonkey 而言,对象基本上有一个(propname,有关属性的信息)对的链表,直到它们有太多属性,当我相信它们仍然保留链表时(因为顺序对于 JS 中的属性很重要)实践),但添加一个带外哈希表,将属性名称映射到链接列表中的条目。
切换到哈希表也可能有其他原因;随着时间的推移,细节尚未完全确定,并且将来可能会发生变化。
链表和哈希表实际上是跨对象共享的;只要两个对象具有相同的属性名称和相应的属性信息(对于具有存储值的属性,不包括值)并且属性以相同的顺序设置,它们就能够共享属性链表。
实际的属性值,当需要存储时,存储在对象的一个数组中(或者更准确地说,两个数组;一个与对象内联分配,其大小在对象创建时固定,一个动态分配)根据稍后添加的属性的需要进行分配和调整大小)。
关于javascript - 在幕后,Javascript 对象是哈希表吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10256974/