发布于 2026-01-06 2 阅读
0

为什么在 JavaScript 中动态添加属性速度很慢?

为什么在 JavaScript 中动态添加属性速度很慢?

JavaScript 允许在对象创建后添加属性。
这提供了很大的自由度,但同时也带来了一定的性能损失。

👉 JavaScript 的对象模型

ECMAScript 规范将所有对象定义为字典,其中字符串键映射到属性。

属性访问是现实世界程序中最常见的操作 => 需要快速访问“值”,因此形状就派上了用场。

JavaScript 的对象模型

👉 形状

如果多个对象的属性相同,则它们的形状也相同。
在这种情况下,JS 引擎会将它们的形状分别存储,然后 JSObject 指向这些形状。

形状存储的是 JSObject 中值的“偏移量”,而不是“值”本身。

形状

👉 过渡链

当你动态地向对象添加属性时,它的形状会形成所谓的过渡链。
下次你访问对象的属性时,JS 引擎需要遍历这个过渡链。

在这种情况下,规模扩大后性能会受到影响。

过渡链

👉 如何像顶尖高手一样优化它?

在 Preact 中,每次渲染都会访问 vNode 属性,因此该操作必须非常快。

为了实现这一点,Preact 开发人员预先添加所有属性,并将 undefined/null 赋值给尚未确定的值

const vnode = {
  type,
  props,
  key,
  ref,
  _children: null,
  _parent: null,
  _depth: 0,
  _dom: null,
  _nextDom: undefined,
  _component: null,
  _hydrating: null,
  constructor: undefined,
  _original: original == null ? ++vnodeId : original
};
Enter fullscreen mode Exit fullscreen mode

PS:请在Twitter上关注我,获取更多类似内容!

文章来源:https://dev.to/fromaline/why-does-dynamically-adding-properties-is-slow-in-javascript-4hm8