深入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 ,如下圖

