Javascript 的數組也是對象,同時任何對象也可以像數組一樣使用,細節如下。
詳細講解了 V8 的對象實現。
對象的實現分爲兩層:
Named properties: in-object properties and extra properties
Numbered properties: fast elements
而模式有 array mode 和 dictionary mode。一般情況會用 array mode,有時也會降級。
Named properties
in-object properties 使用公共 map 來描述其結構,某些情況(難以共用 map)會降級爲 Dictionary mode。
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.
一個叫做 In-object slack tracking 的過程用來決定對象的大小,其後的屬性作爲 extra properties 使用單獨的數組儲存。
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.
Numbered properties
其中,fast elements 包括
fast small integers
fast doubles
fast values
然而 fast elements 有時也會降級爲 dictionary mode
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).
綜上,把 Array 當作 Associative Array 來用,並不會增加性能。