我试图了解像V8这样的JS引擎如何处理数组中的对象,尤其是如何分配内存并提高其效率。
我有一个未排序对象的数组,并且产生了一个在排序数组中具有相同对象的数组
let obj1 = {'test': 'test1'};
let obj2 = {'test': 'test2'};
let obj3 = {'test': 'test3'};
let arr1 = [obj1,obj3,obj2];
...Do sorting and create a new array (no I don't want to destroy the previous)
let arr2 = [obj1,obj2,obj3];
是仅在索引和对象之间创建的引用中的内存开销,还是实际上是在内存空间中复制对象?
在Mozilla的引擎Spidermonkey中,对象数组将由jsval的C ++数组表示。 jsval是64位数量,当表示JS对象时,实际上是指针。
因此,对您的问题的答案是,基本表示形式基本上是一个指针数组,其效率尽可能高。
我说的是“基本上”,因为一旦您开始创建具有大的稀疏间隙,非数值属性或许多其他东西的数组,引擎将取消对它的专业化,并且基本上像在内部将其存储为对象。 >
我还没有阅读v8资料的这一部分,但是我相信实现是相似的。一旦进入该目录,这样做就很明显了,就数组属性访问而言,两个引擎的性能都非常接近。