编程语言
首页 > 编程语言> > javascript – 如何在V8内部表示对象?

javascript – 如何在V8内部表示对象?

作者:互联网

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

作者特别说:

when you use an object as if it was a hash table, it will be turned
into a hash table.

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

解决方法:

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

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

例如:

// 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引擎在检测到此行为时优化了更改结构而不是属性访问(Read more here).

标签:javascript,data-structures,v8,language-design
来源: https://codeday.me/bug/20190727/1555184.html