在引擎盖下,是Javascript对象哈希表

Under the hood, are Javascript objects hash tables?

本文关键字:Javascript 对象 哈希表 引擎      更新时间:2023-09-26

我想知道在Javascript引擎(V8,Spidermonkey等)中如何在引擎盖下实现对象。它们真的只是哈希表吗? 如果是这样,他们如何处理碰撞?

首先,对于不同的JS引擎,答案可能有些不同。 另外,我假设您专门询问财产存储;显然,对象也有一堆其他状态(原型链链接是一个明显的状态)。

在 Spidermonkey 的情况下,对象基本上有一个(propname,关于属性的信息)对的链表,直到它们有太多的属性,当我相信它们仍然保留链表(因为顺序对于 JS 中的属性在实践中很重要)但添加一个带外哈希表,将属性名称映射到链表中的条目。

切换到哈希表可能还有其他原因;随着时间的推移,细节还没有完全修复,将来可能会发生变化。

链表

和哈希表实际上是在对象之间共享的;只要两个对象具有相同的属性名称和相应的属性信息(对于具有存储值的属性,不包括值)并且属性按相同的顺序设置,它们就能够共享属性链表。

当需要存储这些值时,实际的属性值存储在对象的数组中(或者更准确地说,两个数组;一个与对象内联分配,其大小在对象创建时是固定的,另一个动态分配并根据以后添加的属性调整大小)。

可以将

对象视为关联数组(又名map,字典,哈希,查找表)。此数组中的键是对象属性的名称。

我在MDN上找到了这个

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Property_accessors

在JS数组中,关联数组和对象也是相同的。在JS中,数组基本上是具有序列号属性的对象。