V8引擎如何存储对象(VIP课程)

在V8中对象的结构

主要分为三个指针构成的,分别是隐藏类,properties (常规属性),elements(排序属性)

了解 常规属性 和 排序属性

js 复制代码
 let xm = {
    100: "test-100",
    3: "test-3",
    C: "test-C",
    1: "test-1",
    B: "test-B",
    A: "test-A",
 };

for (let key in xm) {
 console.log(`key:${key} value:${xm[key]}`)
}

key:1 value:test-1

key:3 value:test-3

key:100 value:test-100

key:C value:test-C

key:B value:test-B

key:A value:test-A

我们发现了一个神奇的现象,数字从小到大排列,字符串还是按原顺序排列 ????

事实上,这是为了满足 ECMA 规范 要求所进行的设计。按照规范中的描述,可索引的属性应该按照索引值大小升序排列,而命名属性根据创建的顺序升序排列。

在这里我们把对象中的数字属性称为排序属性,在 V8 中被称为 elements,字符串属性就 被称为常规属性,在 V8 中被称为 properties。

js 复制代码
const foo = function () {
    this[90] = "test-100";
    this[1] = "test-1";
    this["B"] = "bar-B";
    this[5] = "test-5";
    this["A"] = "bar-A";
    this["C"] = "bar-C";
};
var test = new foo()

我们看到了 elements 但是没有看到 properties

快属性和慢属性

V8 采取了一个权衡的策略以加快查找属性的效率,这个策略是将部分常规

属性直接存储到对象本身,我们把这称为对象内属性 (in-object properties)

快属性如图

对象内属性就是直接把属性挂到该对象上,查找的只需要一次 foo.A foo.B 因此被称为快属性,但是注意,快属性容量是10个,超出之后就会添加到properties里面,称为慢属性。因此V8 采取了两种存储策略

慢属性如图

比如执行 Foo.property10这个语句来查找 property10 的属性值, 那么在 V8 会先查找出 properties 属性所指向的对象 properties,然后再在 properties 对象中查找 property10 属性,这种方式在查找过程中增加了一步操作,因此会影响到元素的查找效率,这就是慢属性。

相关推荐
lyc233333几秒前
鸿蒙多子类型输入法:3步实现输入模式自由切换🔤
前端
Danta几秒前
从 0 开始学习 Three.js(2)😁
前端·javascript·three.js
凌辰揽月1 分钟前
Web后端基础(基础知识)
java·开发语言·前端·数据库·学习·算法
Dignity_呱2 分钟前
vue3对组件通信做了哪些升级?
前端·vue.js·面试
植物系青年5 分钟前
基于 Lowcode Engine 的低码平台“编码效率”提升实践
前端·低代码
就是我5 分钟前
开发“业务组件库”,该从哪里入手?
前端·javascript·面试
Mintopia8 分钟前
在数字画布上雕刻曲线:NURBS 的奇幻冒险之旅
前端·javascript·计算机图形学
Hacker_seagull12 分钟前
Chrome安装代理插件ZeroOmega(保姆级别)
前端·chrome
石小石Orz15 分钟前
因为没有使用路由懒加载,产生了一个难以寻找的bug
前端
Mintopia16 分钟前
Three.js 力导向图:让数据跳起优雅的华尔兹
前端·javascript·three.js