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

Mat*_*ood 12 javascript arrays v8

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

文章指出:

数组

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

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

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

最好不要让阵列存储从一种类型转换到另一种类型.

题:

将一个什么快速元素线性存储阵列是什么样子?

将一个什么字典元素哈希表数组是什么样子?

出于预防目的,我将如何"从一种类型转换到另一种类型"

Sla*_*ast 10

我会走另一条路.

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

JavaScript对象是从字符串到值的映射.例如

var obj = {
  "name": "Sherlock Holmes",
  "address": "221B Baker Street"
}
Run Code Online (Sandbox Code Playgroud)

除非对特殊情况使用优化表示,否则V8使用哈希表来表示对象.这很像字典使用(单词,含义)对.

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

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

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

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

var arr = [1, 2, 3];
Run Code Online (Sandbox Code Playgroud)

它们是一种特殊情况,针对快速访问进行了优化,因为索引已知并且无法计算.

3)为了预防目的,我该怎么flip from one type to another办?

对于快速元素,如果指定的索引超出了元素数组的末尾,则V8可能会将元素降级为字典模式.

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