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 属性,这种方式在查找过程中增加了一步操作,因此会影响到元素的查找效率,这就是慢属性。

相关推荐
YG亲测源码屋1 分钟前
html表白代码大全可复制免费 html表白网页制作源码
前端·html
夜雪闻竹5 分钟前
React Query + REST API 最佳实践
前端·react.js·前端框架
段ヤシ.6 分钟前
回顾Java知识点,面试题汇总Day12:tomcat、 Java Web(持续更新)
java·前端·tomcat·java web
JAVA学习通7 分钟前
从 Bean 到微服务:一张图吃透 Spring 全家桶底层原理
java·前端·spring
古韵9 分钟前
前端请求库的下一个进化方向:从 Promise 到策略化
前端
独特的螺狮粉11 分钟前
蛋鸡养护周期管理系统 - 鸿蒙PC Electron框架完整实现指南
前端·javascript·华为·electron·前端框架·开源·鸿蒙
忧郁的蛋~16 分钟前
ASP.NET Core Web API 完全指南:请求管道、认证、错误处理到生产部署
前端·后端·asp.net·.net
我穿棉裤了25 分钟前
解决el-form表单校验时显示的红色星号与文字对齐的问题
前端·javascript·vue.js
copyer_xyf27 分钟前
Python 类全面总结
前端·后端·python
copyer_xyf31 分钟前
Python 类型注解:从 TypeScript 迁移理解
前端·后端·python