1. V8中查找一个对象的属性
前置概念: js对象属性的哈希查找和线性查找
因为一个键值对的键和值可以是字符串,数字,数组,对象等等,所以我们需要通过哈希函数将其转换为哈希值,在数据量较小的情况下,线性类的数据结构(数组,链表等)的查找效率较高(因为哈希运算也需要消耗性能),但在数据量较大的情况下,哈希查找的效率接近O(1)。所以JS对象在属性值小于10个的情况直接存在自身,超出部分,数字类的放在element数组中,字符串类的放在properties数组中(因为ES规定数组升序存放,字符串按照设置时序存放),element数组的属性和properties数组中的属性被称为“快属性”,超出部分通过hash map存放,称为“慢属性”。
由于js对象属性的哈希查找和线性查找
比较耗时,所以V8中引入了隐藏类的概念,假如一个对象的形状没发生变化(可以转成字符串比较),那么里面属性的key值就通过隐藏类获取,省去了查找的过程,比如
const obj = {
a:1
}
const hiddenClass = {
0x00001: 4 //假设内存地址0x00001 + 4就是a在内存中的地址
}
假如形状不一样,则重新生成新的隐藏类。
性能举例:
指导意义
对于那些极端场景,通过命中隐藏类优化策略(内联缓存),优化性能