我对无类型的javascript数组的性能特征感到好奇,因为它们不是同质的,并且想知道如何在内部处理它。
例如,如果我在数组中有一个数字和一些任意对象,它们是否连续存储在内存中?是否将所有原语都装箱,并且数组仅包含指向所有内容的指针?是VM的实现细节吗?
答案 0 :(得分:1)
瑞安·佩登(Ryan Peden)似乎已经对所有多汁的细节进行了检查(以及最近):
https://ryanpeden.com/how-do-javascript-arrays-work-under-the-hood/
答案 1 :(得分:1)
这取决于JavaScript引擎的实现。
但是通常在JavaScript数组中,整数和浮点数是按值存储的,所有其他对象都是按引用存储的。
在V8中,数组类型将为PACKED_ELEMENTS
或HOLEY_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>
}