JS中隐藏类和内联缓存

上文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哪些会影响隐藏类的形状。

image.png

我们可以看到全部对象的map的指向都是@141629,说明上面几个对象的隐藏类是指向同一个。说明了elements的个数不影响隐藏类,隐藏类只记录properties的形状。

我们现在给a添加一个字段,看看隐藏类会有什么变化。

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

JS中隐藏类和内联缓存_第1张图片
看看a的map的back_pointer,指向了@151345,跟大家的是一样的。如果后续执行又把ppCustom删除了,那么会沿着back_pointer链寻找匹配的隐藏类,如果匹配到则使用该隐藏类,避免了频繁增删属性导致频繁的生成新的隐藏类。

你可能感兴趣的