在幕后,Javascript对象是哈希表吗?

在幕后,Javascript对象是哈希表吗?,javascript,firefox,google-chrome,v8,spidermonkey,Javascript,Firefox,Google Chrome,V8,Spidermonkey,我想知道在Javascript引擎(V8、Spidermonkey等)中如何在引擎盖下实现对象。它们真的只是散列表吗?如果是这样,它们如何处理冲突?首先,对于不同的JS引擎,答案可能有所不同。另外,我想你是在问关于财产储存的问题;显然,对象也有许多其他状态(原型链环是一个明显的状态) 在Spidermonkey的例子中,对象基本上有一个(propname,关于属性的信息)对的链表,直到它们有太多的属性,而我认为它们仍然保留链表(因为实际上JS中的属性顺序很重要)但是添加一个带外哈希表,将属性名称

我想知道在Javascript引擎(V8、Spidermonkey等)中如何在引擎盖下实现对象。它们真的只是散列表吗?如果是这样,它们如何处理冲突?

首先,对于不同的JS引擎,答案可能有所不同。另外,我想你是在问关于财产储存的问题;显然,对象也有许多其他状态(原型链环是一个明显的状态)

在Spidermonkey的例子中,对象基本上有一个(propname,关于属性的信息)对的链表,直到它们有太多的属性,而我认为它们仍然保留链表(因为实际上JS中的属性顺序很重要)但是添加一个带外哈希表,将属性名称映射到链接列表中的条目

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

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


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

可以将对象视为关联数组(也称为映射、字典、哈希、查找表)。此数组中的键是对象属性的名称

我在MDN上找到了这个

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

看看类似的问题和我的问题。这里我描述了JS引擎使用的优化技术,以及它如何影响密钥查找性能。我希望了解这些细节可以让您编写更高效的JS代码。

请参阅此答案