在对象中存在两种属性, 一种为排序属性 , 一种为常规属性,排序执行的书序为按索引升序排序, 常规属性按照字符串属性根据创建时的顺序升序排列。
function Foo() {
this[100] = 'test-100'
this[1] = 'test-1'
this["B"] = 'bar-B'
this[50] = 'test-50'
this[9] = 'test-9'
this[8] = 'test-8'
this[3] = 'test-3'
this[5] = 'test-5'
this["A"] = 'bar-A'
this["C"] = 'bar-C'
}
var bar = new Foo()
for (key in bar) {
console.log(`index:${key} value:${bar[key]}`)
}
在上面这段代码里面代码执行顺序为:
index:1 value:test-1
index:3 value:test-3
index:5 value:test-5
index:8 value:test-8
index:9 value:test-9
index:50 value:test-50
index:100 value:test-100
index:B value:bar-B
index:A value:bar-A
index:C value:bar-C
当启用慢模式时以Hash作为底层存储结构,key为字符串,字面量方式会存在类型转换。
数组索引属性和命名属性存储在两个单独的数据结构中:
(普通属性中的)快属性与慢属性:
内嵌属性与普通属性:
V8支持对象内属性,存储在对象本身,可以直接访问,速度最快。
内嵌属性的数量由对象的初始大小预先确定。
(普通属性中的)快属性与慢属性:
- 直接存储在属性数组中的属性为 '快属性 '。可通过属性数组中的索引访问
- 慢属性使用HashMap作为属性存储,而是直接存储在属性Hash中(没有缓存,所以叫慢属性)。
结论:
三种不同的命名属性类型:in-object,fast和slow(dictionary)。
- 内嵌属性直接存储在对象本身上,并提供最快的访问。
- 快速属性存在于属性存储中
- 慢属性存在于自包含的属性字典中
- 慢属性提供有效的属性删除和添加,但访问速度比其他两种类型慢。