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

简介: V8引擎如何存储对象(VIP课程)
在V8中对象的结构

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

了解 常规属性 和 排序属性

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。

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

目录
相关文章
|
Web App开发 Rust JavaScript
webRTC 实现人脸识别
webRTC主要是帮我们处理多媒体应用,如音视频通话,屏幕共享都可以实现,主要基于浏览器API调用,其底层浏览器会调用native C++ 等一些库帮我们实现的,而我们在应用层掉API 即可。
693 0
webRTC 实现人脸识别
|
机器学习/深度学习 资源调度 程序员
PMP考试计算题专题
PMP考试计算题专题
821 0
|
4月前
|
人工智能 缓存 自然语言处理
阿里云百炼Token Plan团队版指南:按Credits计费、标准高级和尊享坐席收费价格及使用方法
阿里云百炼Token Plan团队版是面向企业/团队的AI大模型订阅服务,按Credits统一计费,支持文本与图像生成多模型灵活切换。提供标准(198元/月,2.5万Credits)、高级(698元)、尊享(1398元)三档坐席,兼容OpenClaw、Hermes Agent等主流工具,承诺数据不用于训练,保障安全与稳定。快速体验TokenPlan:https://t.aliyun.com/U/fPVHqY
|
安全 API
Vue3 proxy 解决跨域
jsonp 这种方式在之前很常见,他实现的基本原理是利用了HTML里script元素标签没有跨域限制 动态创建script标签,将src作为服务器地址,服务器返回一个callback接受返回的参数
919 0
Vue3 proxy 解决跨域
|
监控 数据可视化 安全
探究架构之 - 45张图玩转Kong Gateway,建议收藏系列 (一)
探究架构之 - 45张图玩转Kong Gateway,建议收藏系列 (一)
1914 1
探究架构之 - 45张图玩转Kong Gateway,建议收藏系列 (一)
|
前端开发
简单学生管理系统HTML前端页面
简单学生管理系统HTML前端页面
930 0
简单学生管理系统HTML前端页面
|
存储 移动开发 编解码
Vue3(开发h5适配)
Vue3(开发h5适配)
659 0
Vue3(开发h5适配)
|
JavaScript
js 获取并解析 url 中参数的三种方法
js 获取并解析 url 中参数的三种方法
3214 0
|
JavaScript
TS中 type和interface的区别
TS中 type和interface的区别
2722 0
|
监控 测试技术 C++
好玩又实用,阿里巴巴开源混沌工程工具 ChaosBlade
减少故障的最好方法就是让问题经常性的发生。在可控范围或环境下,通过不断重复失败过程,持续提升系统的容错和弹性能力。 那么,实施一次高效的混沌工程实验,需要几步呢? 答案:2 步。 ① 登陆 ChaosBlade ② 下载 release 版本,打造故障演练专属工具 高可用架构是保障服务稳定性的核心。
17355 135

热门文章

最新文章