筆記:V8 的 Javascript 對象表示

內容爲該問題下的答案:http://segmentfault.com/q/1010000002423380segmentfault

是對 http://jayconrod.com/posts/52/a-tour-of-v8-object-representation 的學習筆記。app

圖片描述

對象的兩層實現

兩層實現分別爲:dom

  • Named properties: in-object properties and extra properties
  • Numbered properties: fast elements

Named properties

in-object properties 使用公共 map 來描述其結構,某些情況(難以共用 map)會降級爲 Dictionary mode。post

V8 can handle minor divergences like this just fine, but if your code assigns all sorts of random properties to objects from the same constructor in no particular order, or if you delete properties, V8 will drop the object into dictionary mode, where properties are stored in a hash table. This prevents an absurd number of maps from being allocated.ui

一個叫作 In-object slack tracking 的過程用來決定對象的大小,其後的屬性做爲 extra properties 使用單獨的數組儲存。this

Now I'm sure your next question is, "what happens when a new property is added after in-object slack tracking is complete?" This is handled by allocating an overflow array to store the extra properties. The overflow array can always be reallocated with a larger size as new properties are added.spa

最後,methods 和其它屬性一道,儲存在 map 裏。3d

Numbered properties

其中,fast elements 包括code

  • fast small integers
  • fast doubles
  • fast values

然而 fast elements 有時也會降級爲 dictionary modeblog

If you assign to an index that's way past the end of your the elements array, V8 may downgrade the elements to dictionary mode.

當然由於分開儲存,降級並不會影響到其它類型的屬性。

Because named properties and elements are stored separately, even if an object drops into dictionary mode for elements, named properties may still be accessed quickly (and vice versa).

相關文章
相關標籤/搜索