Javascript 不同数组中相同对象的内存分配

Javascript 不同数组中相同对象的内存分配,javascript,arrays,v8,spidermonkey,Javascript,Arrays,V8,Spidermonkey,我试图理解像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

我试图理解像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];

内存开销只是在索引和对象之间创建的引用中,还是在内存空间中复制对象 因此,您的问题的答案是,底层表示基本上是一个指针数组,这是最有效的

我说“基本上”,因为一旦你开始制作一个具有大的稀疏间距、非数值属性或一系列其他东西的数组,引擎就会对它进行非专门化,基本上像在内部存储一个对象一样存储它


我还没有读过v8源代码的这一部分,但我相信它的实现是类似的。这样做是很明显的,一旦您进入其中,两个引擎在阵列属性访问方面的性能非常接近。

唯一的新功能是阵列。对象引用不会生成这些对象的副本。可以通过修改数组中的一个对象并检查原始对象引用是否也被修改来验证这一点。是的,因为它是同一个对象。您有两个数组,其中包含相同的对象引用值。因此,大小(大致)为
3*+
。对象是参考值。除非您显式地创建一个新对象,否则所有内容都将只复制对现有对象内容的引用。这是否回答了您的问题?这是有道理的,谢谢!