深入javascript引擎(2)

定义一个对象 object,然后获取 object 的 x 属性值来做一些事情。例如打印。

8207483-fce7770a0a95c7b8.jpg

我们创建对象每一个属性都有 property attribute 描述这个属性,这些属性我们在用 Object.defineProperty 定义一个对象属性已经用到过。 ECMAScript 规范基本上将所有对象定义为由字符串键值映射到 property 属性 的字典。

8207483-64524f2b5eb18a5d.jpg
8207483-f007873f6c44057f.jpg

1. value 任意数据类型对象属性的默认值,默认值为undefined

2. writable 为布尔型,对象属性是否可修改,flase为不可修改,默认值为true。

3. enumerable 为布尔型,对象属性是否可通过for-in循环,flase为不可循环,默认值为true

4. configurable 也是布尔型,能否使用delete、能否需改属性特性、或能否修改访问器属性、,false为不可重新定义,默认值为true。

以上就是我们创建一个对象时,JavaScript 引擎所做的事。

我们知道在 javascript 语言,几乎所有集合类型都用数组来实现,我们可以用数组实现 map、hashmap、set 等。当然现在 es6 中我们不用再自己造轮子。es6 为我们提供除了数组意外更多集合选择。

8207483-a65e80ae2b06003b.jpg

其实集合本质,在 JavaScript 引擎中也是以对象形式保存在内存中的。多了一个 length 属性,他是数组特有的一个属性,包括数组的长度。大家可以注意一下他属性值。其他就是键对象。

8207483-e5c0f6411fbf6650.jpg

每当我们为数组新增一个元素时,这里添加属性到这个数组对象,键为 1 值为图中所示,然后自增一下 length。

8207483-a09f3c101d7bee81.jpg

我们在定义一个对象时,由于在 JavaScript 基本上算是没有类的概念,即使在 es6 新增 class 或是在 typescript 都为我们准备好类个关键字供我们使用,不过他还是基于 function,而不是真正意义上的 class。也没有必要。

8207483-da3414a989b8a130.jpg

既然没有 class 的概念,所以我们用 object 来直接定义数据结构。不同对象具有相同数据结构,我们就可以将他们看成一类,或者是同一类的数据结构。

8207483-b2c3cd46190f1d8f.jpg
8207483-edfabb7f53cc1fe7.jpg

我们一定对象,上面已经介绍了 object 在 JavaScript 引擎中是如何创建的。

8207483-91c2347ea8f58384.jpg

当我们创建了一个 object 在 JavaScript 将他结构用 shape 来表示,这样 shape 是可以复用,当我们创建一个具有相同数据结构的 object 就可以复用这个 shape ,object 无需考虑结构,和属性的定义,只是持有 object 对应属性的值就可以,这样可以减少内存开销。

8207483-06814814edf76cf2.jpg
8207483-484c3d27c3130629.jpg

当我们再次创建一个具有相同数据结构,有就是具有相同 shape 的对象时,我们可以共享 shape ,如下图

8207483-d2b00d65f3c88bd1.jpg


8207483-d944e081f2a31258.jpg

猜你喜欢

转载自blog.csdn.net/weixin_34144848/article/details/86797436