V8中如何在内部表示对象

How are objects represented internally in V8?

本文关键字:表示 对象 在内部 V8      更新时间:2023-09-26

我一直认为javascript中的对象是简单的键值对,即哈希表,但读了这篇文章后,我感到困惑。

作者特别指出:

当你把一个对象当作哈希表来使用时,它会被翻转转换为哈希表。

那之前到底是什么?尤其是整个段落让我一头雾水。有人能解释一下吗?

根据这个答案,在V8中,对象可以有两种模式——字典模式快速模式

对象最初处于快速模式,其中属性访问不需要哈希映射,也不需要计算。它将structs之类的对象存储在C中。只有当你开始使用"对象就像哈希表一样,它才会变成哈希表"——字典模式。一旦发生这种情况,您将受到在后台使用哈希图进行属性访问的性能损失。

例如:

// running node with `--allow-natives-syntax` flag
var obj = { a: true, b: false };
%HasFastProperties(obj); // true (Fast mode)
delete obj.a;
%HasFastProperties(obj); // false (Dictionary mode)

或者:

var obj = { a: true, b: false };
%HasFastProperties(obj); // true (Fast mode)
// add lots of properties
for (var i = 0; i < 100; i++) {
    obj["prop" + i] = i;
}
%HasFastProperties(obj); // false (Dictionary mode)

它在执行此操作时进入字典模式的原因是性能优化。在字典模式下添加/删除属性比在快速模式下更快,因此V8引擎在检测到这种行为时会针对更改结构而不是属性访问进行优化(点击此处阅读更多信息)。