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

相关文章

前言 做过web项目开发的人对layer弹层组件肯定不陌生,作为l...
前言 前端表单校验是过滤无效数据、假数据、有毒数据的第一步...
前言 图片上传是web项目常见的需求,我基于之前的博客的代码...
前言 导出Excel文件这个功能,通常都是在后端实现返回前端一...
前言 众所周知,js是单线程的,从上往下,从左往右依次执行,...
前言 项目开发中,我们可能会碰到这样的需求:select标签,禁...