在底层,Javascript 对象是哈希表吗? [复制]

Posted

技术标签:

【中文标题】在底层,Javascript 对象是哈希表吗? [复制]【英文标题】:Under the hood, are Javascript objects hash tables? [duplicate] 【发布时间】:2012-05-02 16:09:35 【问题描述】:

我想知道对象是如何在 javascript 引擎(V8、Spidermonkey 等)的底层实现的。它们真的只是哈希表吗?如果是这样,它们如何处理冲突?

【问题讨论】:

看到这个答案***.com/a/6602088/8338 【参考方案1】:

看看类似的问题How does JavaScript VM implements Object property access? 和我的answer。在这里,我描述了 JS 引擎使用的优化技术以及它如何影响键查找性能。希望了解这些细节能让你写出更高效的JS代码。

【讨论】:

【参考方案2】:

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

我在 MDN 上找到了这个

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

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

【讨论】:

【参考方案3】:

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

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

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

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

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

【讨论】:

以上是关于在底层,Javascript 对象是哈希表吗? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

区块链是单链表吗?

Python字典的底层实现

redis_哈希对象

如何在 JavaScript 中创建哈希或字典对象 [重复]

《闲扯Redis七》Redis字典结构的底层实现

Redis:hash类型底层数据结构剖析