在内部 JavaScript 如何遍历对象键?

Internally how does JavaScript iterate over object keys?

在JavaScript中,当我们使用for...in循环或Object.keys()方法时,内部引擎如何迭代对象键?

我知道这可能会从一种实现方式到另一种实现方式略有不同,但我确信有一种通用方法,您能给出一个鸟瞰图吗?

谢谢!

它与 object.keys 的工作方式无关,而与对象属性的表示方式有关。在 V8 中有对象内属性(与 C 结构字段或 Java 对象字段相同的表示),存储在固定数组中的固定对象外属性和存储在散列中的动态对象外属性 table.

对象内属性和固定的对象外属性的布局分别存储在对象的隐藏class中。如果对象的布局发生变化,它会获得一个新的隐藏 class。与 Java's Class object 一样,隐藏的 class 对象包含固定属性的名称,您只需遍历该数组即可。

当使用散列 table(又名字典、散列图或规范化对象)表示时,您必须动态地遍历散列 table 键,就像遍历任何散列 table 一样。