对象如何在V8内部表示?

时间:2016-04-29 13:53:54

标签: javascript data-structures v8 language-design

我一直认为javascript中的对象是简单的键值对,即哈希表,但在阅读this文章之后我很困惑。

作者特别说:

  

当您将对象用作哈希表时,它将被转换   进入哈希表。

那么,以前到底是怎么回事?特别是整个段落让我困惑。有人能说清楚吗?

1 个答案:

答案 0 :(得分:7)

根据this answer,在V8中,对象可以有两种模式 - 字典模式快速模式

对象最初处于快速模式,其中属性访问不需要哈希映射 - 无计算。它在C中存储像结构一样的对象。只有当你开始使用“对象就好像它是一个哈希表时,它才会变成一个哈希表”--dictionary模式。一旦发生这种情况,您将获得在后台使用哈希映射进行属性访问的性能损失。

例如:

create database test;

或者:

// 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)

执行此操作时进入字典模式的原因是性能优化。在字典模式下添加/删除属性比在快速模式下更快,因此V8引擎在检测到此行为时会优化更改结构而不是属性访问(Read more here)。