有人可以帮助描述Javascript中的两种类型的数组存储吗?

时间:2016-11-22 05:25:54

标签: javascript arrays v8

我正在HTML5Rocks上阅读关于V8的这篇文章。这篇文章很老了,但我几乎一无所知,这让我很烦恼。我一次采取这一步,但有人可以帮助我使用阵列部分吗?

文章指出:

  

阵列

     

为了处理大型和稀疏数组,有两种类型   内部数组存储:

     
      
  • 快速元素:紧凑型密钥集的线性存储空间

  •   
  • 字典元素:哈希表存储,否则

  •   
     

最好不要让阵列存储从一种类型转换为   另一个。

问题:

快速元素线性存储阵列会是什么样的?

Dictionary Elements 哈希表数组会是什么样的?

出于预防目的,我将如何“从一种类型翻转到另一种类型”

2 个答案:

答案 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'}那么它将它视为元素。

在内部我认为保持线性数组不同它寻找'{}'