简单理解v8中object的属性

118 阅读1分钟

v8在存储属性的时候, 并没有直接采用字典的存储方式, 因为非线性的查询起来比较慢.

而且ECMAScript 规范中定义了数字属性应该按照索引值大小升序排列,字符串属性根据创建时的顺序升序排列

所以v8将属性分类:

  • 数字属性为排序属性, 存在element里
  • 字符串属性为常规属性, 存在properties里

image.png

所以我们查找一个属性的话

  1. 先查找elements中的元素
  2. 再查找properties中的元素

快属性和慢属性

image.png

这样查找的话, 会多一层处理, 效率会低一些.

所以v8做了规则判断:

  1. 小于10条, 直接存在对象内
  2. 大于10条, 以线性数据结构的方式存放在 properties 属性里面
  3. 大量属性, 以非线性数据结构的方式存放在 properties 属性里.

一切都是为了快,

少的时候, 线性结构>非线性结构, 因为查找比较快.

但是多的时候, 非线性结构>线性结构. 因为添加和删除, 线性结构内存上的开销比较大.

所以我们将保存在线性数据结构中的属性称之为**“快属性”.**

将保存非线性数据结构中的属性称为**”慢属性”**

image.png

总结

一切为了快, 最开始的属性都是存在慢属性里面的, 经过一系列的优化之后, 有了对象内属性, 和快属性. 减少步骤, 减少查询时间. 根据不同情况不断调优.