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

标签 javascript firefox google-chrome v8 spidermonkey

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

最佳答案

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

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

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

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

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

关于javascript - 在幕后,Javascript 对象是哈希表吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10256974/

相关文章:

javascript - 值得信赖的 Chrome 扩展程序

google-chrome - 访问 Google Chrome 的缓存

Javascript window.open() 工具栏=no 不起作用

Javascript Setter 没有设置额外的属性值

javascript return false vs preventdefault 焦点改变

javascript - 从 PHP 动态生成的选择中获取值 jQuery

javascript - Firefox 中的 HTML 5 拖放无法按预期工作

html - 链接在 IE 中有效...但在 Firefox 和 Safari 中无效

javascript - 重新加载 html5 视频标签的源在 chrome 上不起作用

javascript - jQuery 替换所有单个字符