深入javascript引擎(2)
定义一个对象 object,然后获取 object 的 x 属性值来做一些事情。例如打印。
我们创建对象每一个属性都有 property attribute 描述这个属性,这些属性我们在用 Object.defineProperty 定义一个对象属性已经用到过。 ECMAScript 规范基本上将所有对象定义为由字符串键值映射到 property 属性 的字典。
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 为我们提供除了数组意外更多集合选择。
其实集合本质,在 JavaScript 引擎中也是以对象形式保存在内存中的。多了一个 length 属性,他是数组特有的一个属性,包括数组的长度。大家可以注意一下他属性值。其他就是键对象。
每当我们为数组新增一个元素时,这里添加属性到这个数组对象,键为 1 值为图中所示,然后自增一下 length。
我们在定义一个对象时,由于在 JavaScript 基本上算是没有类的概念,即使在 es6 新增 class 或是在 typescript 都为我们准备好类个关键字供我们使用,不过他还是基于 function,而不是真正意义上的 class。也没有必要。
既然没有 class 的概念,所以我们用 object 来直接定义数据结构。不同对象具有相同数据结构,我们就可以将他们看成一类,或者是同一类的数据结构。
我们一定对象,上面已经介绍了 object 在 JavaScript 引擎中是如何创建的。
当我们创建了一个 object 在 JavaScript 将他结构用 shape 来表示,这样 shape 是可以复用,当我们创建一个具有相同数据结构的 object 就可以复用这个 shape ,object 无需考虑结构,和属性的定义,只是持有 object 对应属性的值就可以,这样可以减少内存开销。
当我们再次创建一个具有相同数据结构,有就是具有相同 shape 的对象时,我们可以共享 shape ,如下图