fast properties 是 v8 通过稳定对象结构自动启用的内存优化机制,将属性存入对象头后的连续区域(in-object),实现类似 struct 的快速访问;若对象结构不稳定则退化为慢速字典模式。

Fast Properties 是 V8 引擎内部的一种对象属性存储优化机制,它不靠“开启开关”,而是通过让对象保持稳定结构,触发引擎自动采用更紧凑、更直接的内存布局,从而显著提升属性访问速度。
Fast Properties 的核心是对象内存布局优化
当对象满足一定条件(如属性一次性声明、顺序固定、无 delete 或动态增删),V8 会将其属性直接存入对象头之后的连续内存区域,称为 in-object properties(对象内属性)。这种布局类似 C 语言的 struct:属性值按固定偏移量存放,读取时只需计算地址、一次内存加载即可拿到值,无需跳转到外部哈希表查找。
与之相对的是 Dictionary mode(字典模式):一旦对象频繁增删属性、使用非法标识符、或属性过多超出阈值,V8 就会把所有属性挪进独立的哈希表中。每次访问都要先查哈希、再解引用指针,多出至少一次内存跳转和哈希计算,实测慢近 3 倍。
哪些操作能维持 Fast Properties
- 构造对象时一次性声明全部属性:
{ id, name, price }✅,而非先{ id: 1 }再obj.name = 'a'❌ - 严格保持属性定义顺序:始终
{ x, y, z },避免有时{ y, x, z } - 避免
delete obj.prop、obj.temp = 1等临时操作——这会强制对象进入字典模式 - 数值型属性尽量不用字符串键:
obj['123']被归为 elements,obj['id_123']才算 properties;二者存储分离,IC 不互通
to-fast-properties 的作用其实是“强制回归”
to-fast-properties 并不是给对象“加加速器”,而是对已退化为字典模式的对象执行一次 Object.preventExtensions() + 属性迁移 + 隐藏类重置,逼 V8 重建 in-object layout。它适合用在初始化阶段,比如批量创建配置项、缓存实体、渲染数据列表前统一调用:
const item = { id: 1, title: 'foo', ts: Date.now() };<br>toFastProperties(item); // 触发 V8 重新整理内存布局<br>console.log(item.title); // 后续访问走 in-object 快路径
Fast Properties 和内联缓存(IC)协同工作
Fast Properties 提供了“快的内存位置”,而内联缓存(IC)负责“快的访问路径”。只有当对象处于 Fast Properties 模式、且隐藏类稳定时,a.x 才能在 IC 中命中单态缓存:直接根据上次记录的隐藏类 + 偏移量取值,跳过原型链遍历和哈希查找。一旦混用 a['x'] 或 Reflect.get(a, 'x'),IC 退化,即使内存布局仍是 fast,访问效率也会断崖下跌。











