然而,一旦属性数量超过某个阈值(实际上,当前的度量标准与使用的存储空间有关,而不是实际的属性数量),对象就会改为使用字典映射。此时,对象将使用哈希表进行重写。一般来说,它不会再经历任何映射转换-添加的任何其他属性都将放入哈希表中。
快速映射允许V8生成优化代码(使用Crankshaft),其中对象内部属性的偏移量被硬编码到机器代码中。这使得它在可以这样做的情况下非常快-它避免了任何查找的需要。
显然,生成的机器代码取决于映射-如果对象的数据布局发生更改,则必须在必要时丢弃并重新优化代码。 V8具有类型分析机制,该机制收集有关在未优化代码执行期间各种对象的类型的信息。 它不会触发对代码的优化,直到满足某些稳定性约束条件为止-其中之一是函数中使用的对象的映射不经常更改。
这里有一个视频,其中V8的主要开发人员描述了诸如地图转换等内容。
针对您特定的测试用例,我认为在准备循环中添加属性时,它会经过几百个地图转换,然后最终转换为基于字典的对象。它肯定不会经过260,000次地图转换。
关于您关于二叉树的问题:一个大小适当的哈希表(具有合理的哈希函数和大量对象)将始终优于二叉树,如果您只是搜索用例(似乎您的测试代码是这样做的),因为所有插入都是在设置阶段完成的。