Javascript运行机制:隐藏类

web前端
文章发布日期
2025-05-29
热度
0
本文共计
1133字
预计阅读
6分钟

JavaScript 是一种动态类型语言,其对象属性的动态增删特性使得对象结构在运行时可能频繁变化。隐藏类(Hidden Class)是 V8 引擎(Chrome 浏览器等使用的 JS 引擎)为优化 JavaScript 对象访问性能而采用的一种机制。

基本概念

在 JavaScript 中,当你创建一个对象并为其添加属性时,V8 引擎并不会像传统语言那样直接将属性存储在连续的内存空间中。相反,引擎会为该对象创建一个隐藏类,这个隐藏类描述了对象的属性布局,包括属性的名称、类型和存储位置等信息。当对象的属性发生变更(如添加新属性、删除已有属性或修改属性的可写性等)时,V8 引擎会为该对象创建一个新的隐藏类,并更新对象与隐藏类之间的关联关系。

作用及影响

  • 性能提升 : 隐藏类使得 V8 引擎能够对对象的属性访问进行优化。当多个对象拥有相同的隐藏类时,引擎可以对这些对象的属性访问操作进行相同方式的优化,减少属性查找的时间开销,提高代码执行效率。
  • 影响内存布局 : 隐藏类的切换会导致对象在内存中的布局发生变化。频繁的对象结构变更(如不断添加或删除属性)会使隐藏类频繁切换,从而影响对象的内存布局稳定性。这可能导致内存分配不连续、缓存未命中等问题,进而对性能产生负面影响。

相关示例

js 复制代码
let obj1 = {};
let obj2 = {};

// obj1 和 obj2 初始时共享同一个隐藏类
obj1.a = 1;
// 此时 obj1 的隐藏类发生切换,添加了属性 a 的描述信息
obj2.a = 2;
// obj2 的隐藏类也切换为与 obj1 相同的新隐藏类

obj1.b = 3;
// obj1 的隐藏类再次切换,添加了属性 b 的描述信息
// 此时 obj2 的隐藏类仍保持之前的状态,与 obj1 的隐藏类不同

总结

浏览器 内核 JS解析引擎
chrome 早期 WebKit,现目前 Blink V8
Mozilla Firefox Gecko SpiderMonkey
Edge Chromium Chakra / V8
Safari Webkit JavascriptCore
  • 比较主流的 JS 引擎是 v8,这里假设是跑在 chrome 或 node 上,用的是 v8 引擎。​
  • V8 是一个 c++ 实现的 js 解析引擎,内部利用 隐藏类(Hidden Class) 的方式来存放 JS 对象。​
  • 隐藏类的特性是:多个属性顺序一致的 JS 对象,会重用同一个隐藏类,减少 new Class 的开销。​
  • 所以左边生成1个隐藏类,而右边生成3个隐藏类,因此左边代码性能更好。​
  • 指导代码编写习惯:定义对象或类时,尽可能保证属性顺序一致。

在开发过程中,为了充分利用隐藏类带来的性能优势,应尽量保持对象的结构一致性,避免频繁地动态添加或删除对象属性。