关于javascript:JS中隐藏类和内联缓存

7次阅读

共计 797 个字符,预计需要花费 2 分钟才能阅读完成。

上文 v8 中快属性和慢属性讲到快属性和慢属性,搞清楚了 v8 中对象的属性查问是怎么样的。明天来看看为了放慢对象的查问,v8 还做了什么事件。

暗藏类

还是拿上面的构造函数来举例子

    function Foo(elNum, pNum) {for (let i = 0; i < elNum; i++) {this[i] = 'ele' + i;
    }

        for (let i = 0; i < pNum; i++) {this['pp' + i] = 'property' + i;
    }
}
var a = new Foo(10, 10);
var b = new Foo(10, 10);
var c = new Foo(20, 10);
var j = new Foo(0, 10);

上述的实例中,咱们看看它们的暗藏类是什么,elements 和 properties 哪些会影响暗藏类的形态。




咱们能够看到全副对象的 map 的指向都是 @141629,阐明下面几个对象的暗藏类是指向同一个。阐明了 elements 的个数不影响暗藏类,暗藏类只记录 properties 的形态。

咱们当初给 a 增加一个字段,看看暗藏类会有什么变动。

![image.png](/img/bVcKqx2)
a.ppCustom = 'property comstom';


因为我刷新了页面,所以这里指向产生了变动,不过咱们只看绝对变动就能够。b/c/ j 的 map 都指向了 @151345,而 a 的 map 变成了 @151391。产生了变动,阐明当对象的形态产生了变动的时候,暗藏类须要对应生成一个新的。
然而因为 v8 引擎思考到了开发的时候既然会减少属性,也会有可能删除属性,所以 map 中有一个 back_pointer 字段,指向上一次 map 的地址

看看 a 的 map 的 back_pointer,指向了 @151345,跟大家的是一样的。如果后续执行又把 ppCustom 删除了,那么会沿着 back_pointer 链寻找匹配的暗藏类,如果匹配到则应用该暗藏类,防止了频繁增删属性导致频繁的生成新的暗藏类。

正文完
 0