【问题标题】:Could someone help describe the two types of array storage in Javascript?有人可以帮助描述 Javascript 中的两种类型的数组存储吗?
【发布时间】:2016-11-22 05:25:53
【问题描述】:

我正在HTML5Rocks 上阅读这篇关于 V8 的文章。这篇文章很旧,但我几乎一无所知,这让我很困扰。我一次迈出这一步,但有人可以帮助我处理数组部分吗?

文章称:

数组

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

  • Fast Elements:紧凑键集的线性存储

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

最好不要导致数组存储从一种类型翻转到 另一个。

问题:

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

字典元素哈希表数组是什么样的?

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

【问题讨论】:

  • 我认为线性存储数组将是只有单个元素的普通数组,而哈希存储将是对象数组。
  • 文章中没有提到元素,而是字典元素。你没有很好地反映报价。
  • @trincot 抱歉复制和错误。
  • 好的,但是现在您在第一个选项中有一个尾随单词字典。

标签: javascript arrays v8


【解决方案1】:

我会换个方式。

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

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

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

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

现在,此哈希表访问速度很慢,因为最初哈希表中的所有键和值都是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

【讨论】:

  • 更新了答案
  • 不要删除数组元素。它会使数组转换为较慢的内部表示。当键集变得稀疏时,V8 最终会将元素切换到字典模式,这会更慢。 jsperf.com/packed-vs-holey-arrays
  • @User528491,它们是一种特殊情况,已针对更快进行了优化 - 但仍然是哈希表,对吗?
【解决方案2】:

先生,我可能是错的,但根据您的问题,我所观察到的已得到解释

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

在内部我认为要保持线性数组不同,它会寻找“{}”

【讨论】:

  • 所以 liner 是 a[0] a[1] ... a[20] 其中哈希表是 a['myname'] = 'nick' ?
  • no a['myname'] = nick 如果它是一个对象而不是数组元素,则将被考虑
猜你喜欢
  • 2022-06-10
  • 2020-04-22
  • 1970-01-01
  • 1970-01-01
  • 2011-07-24
  • 1970-01-01
  • 2017-08-29
  • 2022-11-01
  • 2016-04-19
相关资源
最近更新 更多