我想知道对象是如何在 Javascript 引擎(V8、Spidermonkey 等)中实现的。它们真的只是哈希表吗?如果是这样,他们如何处理碰撞?
3 回答
首先,对于不同的 JS 引擎,答案可能有些不同。另外,我假设您是在专门询问财产存储;显然对象也有很多其他状态(原型链链接是一个明显的状态)。
在 Spidermonkey 的情况下,对象基本上有一个(propname,关于属性的信息)对的链表,直到它们有太多的属性,当我相信它们仍然保留链表时(因为在实践中,顺序对 JS 中的属性很重要)但是添加一个带外哈希表,将属性名称映射到链表中的条目。
切换到哈希表可能还有其他原因;随着时间的推移,细节并未完全确定,未来可能会发生变化。
链表和哈希表实际上是跨对象共享的;只要两个对象具有相同的属性名称和相应的属性信息(不包括值,对于具有存储值的属性)并且属性以相同的顺序设置,它们就能够共享属性链表。
实际的属性值,当需要存储时,存储在对象中的一个数组中(或者更准确地说,两个数组;一个与对象内联分配,其大小在对象创建时固定,一个动态分配和调整大小根据稍后添加的属性的需要)。
看一个类似的问题JavaScript VM 如何实现对象属性访问?和我的回答。在这里,我描述了 JS 引擎使用的优化技术以及它如何影响键查找性能。希望了解这些细节能让你写出更高效的JS代码。
可以将对象视为关联数组(又名映射、字典、哈希、查找表)。此数组中的键是对象属性的名称。
我在 MDN 上找到了这个
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Property_accessors
在 JS 中数组是关联数组,对象也是一样的。在 JS 中,数组基本上是属性为序号的对象。