我想知道如何在Javascript引擎(V8,Spidermonkey等)中实现对象。它们真的只是哈希表吗?如果是这样,他们如何处理碰撞?
答案 0 :(得分:9)
首先,对于不同的JS引擎,答案可能有所不同。另外,我假设您具体询问有关物业存储的事宜;显然,对象也有一堆其他状态(原型链链接是明显的)。
对于Spidermonkey,对象基本上有一个(propname,有关属性的信息)对的链表,直到它们有太多的属性,当我相信它们仍然保留链表时(因为顺序对于JS中的属性很重要)练习)但添加一个带外哈希表,它将属性名称映射到链表中的条目。
切换到哈希表可能还有其他原因;细节尚未确定,并且可能会在未来发生变化。
链接列表和哈希表实际上是跨对象共享的;只要两个对象具有相同的属性名称和相应的属性信息(不包括值,对于具有存储值的属性)并且属性按相同的顺序设置,它们就能够共享链接的属性列表。
当需要存储的属性值存储在对象中的数组中时(或者更确切地说,两个数组;一个与对象内联分配,其大小在对象创建时固定,一个动态一个)根据需要为稍后添加的属性分配和调整大小。)
答案 1 :(得分:0)
人们可以将一个对象视为一个关联数组(也就是地图,字典,哈希,查找表)。此数组中的键是对象属性的名称。
我在MDN上找到了
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Property_accessors
在JS数组中,关联数组和对象也相同。 基本上,在JS数组中,对象是具有顺序号的属性。
答案 2 :(得分:0)
看看类似的问题How does JavaScript VM implements Object property access?和我的answer。在这里,我描述了JS引擎使用的优化技术以及它如何影响键查找性能。我希望了解这些细节可以使您编写更有效的JS代码。
答案 3 :(得分:-3)
是的,他们是哈希表。我不明白你的碰撞部分,请解释你问题的第二部分