有人可以帮忙描述一下 Javascript 中的两种数组存储方式吗?

Could someone help describe the two types of array storage in Javascript?

我正在 HTML5Rocks 上阅读这篇关于 V8 的文章。这篇文章很旧,但我几乎能理解 none,这让我很困扰。我一次执行这 1 个步骤,但有人可以帮助我处理数组部分吗?

文章指出:

Arrays

In order to handle large and sparse arrays, there are two types of array storage internally:

  • Fast Elements: linear storage for compact key sets

  • Dictionary Elements: hash table storage otherwise

It's best not to cause the array storage to flip from one type to another.

问题:

Fast Elements 线性存储阵列会是什么样子?

字典元素散列table数组会是什么样子?

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

先生,我可能是错的,但根据你的问题,我已经解释了我观察到的内容

当我们初始化一个数组时,它在内部获取键为 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'} 然后它认为它是元素。

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

我会走另一条路。

2) Dictionary Elements 散列 table 数组会是什么样子?

一个JavaScript对象是一个从字符串到值的映射。例如

var obj = {
  "name": "Sherlock Holmes",
  "address": "221B Baker Street"
}

V8 使用散列 tables 来表示对象,除非使用针对 特殊情况 的优化表示。这很像字典使用(单词,含义)对。

现在,这个散列 table 访问速度很慢,因为最初散列 table 中的所有键和值都是 undefined。在插入新对时,计算哈希值并将该对插入到插入索引处。如果该索引处已经有一个键,请尝试在下一个索引处插入,依此类推。

1) Fast Elements 线性存储阵列会是什么样子?

在 V8 中,一个 element 是一个 属性,它的键是一个非负整数 (0, 1, 2, ...)即一个简单的线性数组,其属性可以通过数字索引访问。

快速元素存储在连续数组中。例如

var arr = [1, 2, 3];

它们是特例,因为索引已知且无需计算,所以针对更快的访问进行了优化。

3) 为了预防起见,我将如何flip from one type to another?

对于快速元素,如果您分配的索引远远超过元素数组的末尾,V8 可能会将元素降级为字典模式。

参考:http://jayconrod.com/posts/52/a-tour-of-v8-object-representation