有人可以帮忙描述一下 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
我正在 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