Object.seal 通过固定对象结构为引擎提供确定性信息,使隐藏类稳定、内联缓存高效,从而提升高频属性访问性能;需在创建后立即逐个密封,配合严格模式与类型一致效果更佳。

Object.seal 本身不直接“加速”属性访问,但它通过固定对象结构,为 JavaScript 引擎(如 V8)提供确定性信息,从而可能触发底层优化,提升大量同类对象的属性读写效率。
为什么密封能带来性能收益
现代 JS 引擎对对象使用“隐藏类(Hidden Class)”机制管理内存布局和属性查找。当对象频繁增删属性或动态添加字段时,隐藏类会不断变更,导致内联缓存失效、查表变慢、甚至退化为字典模式。
调用 Object.seal 后:
- 对象不可扩展,所有自有属性的 configurable: false,结构彻底稳定
- 引擎可预判该对象永远只有这些属性,且顺序/偏移量不会改变
- 在批量处理(如数组遍历、渲染循环)中,属性访问更可能命中快速路径(如 inline cache 或 fast object mode)
适合密封对象数组的典型场景
适用于结构统一、生命周期长、高频访问的只读结构数据,例如:
- 游戏中的实体坐标点:
{x: 0, y: 0, z: 0} - 图表数据点:
{timestamp: 1715286240000, value: 42.5} - 配置项列表:
{key: "theme", type: "string", default: "light"}
正确密封对象数组的操作方式
必须在对象创建后、首次使用前立即密封,且需逐个密封每个对象(seal 不递归):
const points = Array.from({ length: 10000 }, () => ({ x: 0, y: 0 }));
points.forEach(obj => Object.seal(obj)); // ✅ 关键:每个对象单独 seal
<p>// 后续访问更高效(尤其在循环中)
for (let i = 0; i </p>
⚠️ 注意:若数组后续还需 push 新对象,新对象也必须 seal;若原始对象已存在未密封的嵌套对象(如 {pos: {x:0,y:0}}),需手动递归 seal,否则嵌套层无优化效果。
配合严格模式与类型一致性效果更佳
密封 + 严格模式 + 统一初始化,能进一步强化引擎优化信心:
- 启用
"use strict":让非法操作(如静默失败的赋值)立即报错,避免意外破坏结构 - 避免混合类型:不要让同一属性有时是 number,有时是 string(如
obj.value = 42后又obj.value = "hello"),这会触发去优化(deoptimization) - 优先使用字面量一次性初始化全部属性,而非分步赋值










