考虑到非类型化的javascript数组不是同质的,它们如何在内存中布置?

时间:2019-05-03 07:08:31

标签: javascript arrays performance

我对无类型的javascript数组的性能特征感到好奇,因为它们不是同质的,并且想知道如何在内部处理它。

例如,如果我在数组中有一个数字和一些任意对象,它们是否连续存储在内存中?是否将所有原语都装箱,并且数组仅包含指向所有内容的指针?是VM的实现细节吗?

2 个答案:

答案 0 :(得分:1)

瑞安·佩登(Ryan Peden)似乎已经对所有多汁的细节进行了检查(以及最近):

https://ryanpeden.com/how-do-javascript-arrays-work-under-the-hood/

答案 1 :(得分:1)

这取决于JavaScript引擎的实现。

但是通常在JavaScript数组中,整数和浮点数是按值存储的,所有其他对象都是按引用存储的。

V8中,数组类型将为PACKED_ELEMENTSHOLEY_ELEMENTS(取决于数组的创建/填充方式),并且每个字符串还将另外存储在堆中。 / p>

要进行验证,请在V8引擎的调试版本中使用%DebugPrint函数(您可以使用jsvu工具获得一个):

d8> var a = [1, 2, 'aaa']; %DebugPrint(a);
DebugPrint: 000003B13FECFC89: [JSArray]
 - elements: 0x03b13fecfc31 <FixedArray[3]> {
           0: 1
           1: 2
           2: 0x00c73b3e0fe1 <String[#3]: aaa>
 }