答案 0 :(得分:1)
Mozilla人在Anatomy of a JavaScript Object上做了一篇很棒的博客文章。简而言之(如果链接停止工作),Firefox使用三种数据结构来跟踪对象的属性。
第一个是对象的值数组。存储在属性中的任何内容都会添加到此数组中。由于它是一个数组,因此每次添加元素时,JavaScript引擎都不会从堆中分配少量内存。这种方式越快越好不会破坏RAM。
第二个是对象的“对象映射”,它将键映射到JSScopeProperty对象。 因为地图是一个链接列表,最近添加的属性位于头部,所以JavaScript引擎可以从头到尾遍历列表并按插入顺序获取所有属性
JSScopeProperty对象记住数组中属性值的索引,以及与属性相关的其他元数据。这就是JavaScript如何将属性名称链接到它们的值。
拥有两个独立的数据结构可以节省动态内存分配(这会降低性能),并通过将多个JSScopeProperty实例指向内存中的相同值,甚至重新使用整个对象映射,为JavaScript引擎提供节省内存的机会两个对象具有相同的属性。