在 JavaScript 中,对象如何跟踪 key/value 插入顺序?
In JavaScript how do objects keep track of key/value insertion order?
看看here:
The de facto standard is to match insertion order
这是如何在引擎内部实现的? (为了简单起见,我们说 v8)
Mozilla 人员在 Anatomy of a JavaScript Object 上写了一篇很棒的博客 post。简而言之(如果 link 停止工作),Firefox 使用三种数据结构来跟踪对象的属性。
第一个是对象的值数组。您存储在 属性 中的任何内容都会添加到此数组中。因为它是一个数组,所以 JavaScript 引擎不会在每次添加元素时从堆中分配少量内存。这种方式速度更快并且不会碎片化 RAM。
第二个是对象的 "object map",它将键映射到 JSScopeProperty 对象。 因为地图是引擎盖下的 linked 列表,最近添加的 属性 位于头部,JavaScript 引擎可以从列表尾部迭代到head 并按照插入的顺序获取所有属性.
JSScopeProperty 对象记住数组中 属性 值的索引,以及与 属性 相关的其他元数据。这就是 JavaScript links 属性 命名它们的值的方式。
像这样拥有两个单独的数据结构可以节省动态内存分配(这会降低性能)并为 JavaScript 引擎提供机会通过将多个 JSScopeProperty 实例指向内存中的相同值甚至重新如果两个对象具有相同的属性,则使用整个对象映射。
看看here:
The de facto standard is to match insertion order
这是如何在引擎内部实现的? (为了简单起见,我们说 v8)
Mozilla 人员在 Anatomy of a JavaScript Object 上写了一篇很棒的博客 post。简而言之(如果 link 停止工作),Firefox 使用三种数据结构来跟踪对象的属性。
第一个是对象的值数组。您存储在 属性 中的任何内容都会添加到此数组中。因为它是一个数组,所以 JavaScript 引擎不会在每次添加元素时从堆中分配少量内存。这种方式速度更快并且不会碎片化 RAM。
第二个是对象的 "object map",它将键映射到 JSScopeProperty 对象。 因为地图是引擎盖下的 linked 列表,最近添加的 属性 位于头部,JavaScript 引擎可以从列表尾部迭代到head 并按照插入的顺序获取所有属性.
JSScopeProperty 对象记住数组中 属性 值的索引,以及与 属性 相关的其他元数据。这就是 JavaScript links 属性 命名它们的值的方式。
像这样拥有两个单独的数据结构可以节省动态内存分配(这会降低性能)并为 JavaScript 引擎提供机会通过将多个 JSScopeProperty 实例指向内存中的相同值甚至重新如果两个对象具有相同的属性,则使用整个对象映射。