我正在HTML5Rocks上阅读关于V8的这篇文章。这篇文章很老了,但我几乎一无所知,这让我很烦恼。我一次采取这一步,但有人可以帮助我使用阵列部分吗?
文章指出:
阵列
为了处理大型和稀疏数组,有两种类型 内部数组存储:
快速元素:紧凑型密钥集的线性存储空间
字典元素:哈希表存储,否则
最好不要让阵列存储从一种类型转换为 另一个。
问题:
快速元素线性存储阵列会是什么样的?
Dictionary Elements 哈希表数组会是什么样的?
出于预防目的,我将如何“从一种类型翻转到另一种类型”?
答案 0 :(得分:10)
我会走另一条路。
2)Dictionary Elements
哈希表数组看起来像什么?
JavaScript对象是从字符串到值的映射。 e.g。
var obj = {
"name": "Sherlock Holmes",
"address": "221B Baker Street"
}
除非使用特殊情况的优化表示,否则V8使用哈希表来表示对象。这很像字典使用(单词,含义)对。
现在,这个哈希表访问速度很慢,因为最初哈希表中的所有键和值都是undefined
。在插入新对时,计算散列并在插入索引处插入对。如果该索引处已有密钥,请尝试在下一个索引处插入,依此类推。
1)Fast Elements
线性存储阵列会是什么样的?
在V8中,element
是属性,其键是非负整数(0,1,2,...),即一个简单的线性数组,其属性可以是通过数字索引访问。
快速元素存储在连续的数组中。 e.g。
var arr = [1, 2, 3];
它们是一个特殊情况,它针对更快的访问进行了优化,因为索引已知并且无法计算。
3)出于预防目的,我将如何flip from one type to another
?
对于快速元素,如果您指定的索引超出了元素数组的末尾,则V8可能会将元素降级为字典模式。
参考:http://jayconrod.com/posts/52/a-tour-of-v8-object-representation
答案 1 :(得分:4)
先生,我可能错了,但根据你的问题,我所观察到的是解释
当我们初始化一个数组时,它在内部得到键为0,1,2 ....等,因为我将带有值的元素推入数组但是数组不考虑它
ex :
var arr = new Array()
arr[0] = 1
arr[1] = 2
arr[2] = "myname";
arr['myname'] = nick;
但是当我做arr.length时我得到3所以它不考虑除了数字之外的键,但是如果我写arr[3] = {myname:'nick'}
那么它将它视为元素。
在内部我认为保持线性数组不同它寻找'{}'