首页 > 解决方案 > 对象内的 Javascript 引用快捷方式(它们是否占用空间?)

问题描述

我有一个具有非常大的属性的 javascript 对象(想象一下“大型对象 X”是复杂且大型的 javascript 对象):

let myObject = {
    primary: { "large-object A" },
    secundary: [ {"large-object B"}, {"large-object C"}, {"large-object D"} ],
}

在某些情况下,我只需要拥有myObject.primary,但有时我不关心主要/次要区别,我想遍历所有对象。现在,我做了一些测试,我似乎能够创建一个新属性,我称之为“ all”,它可以通过引用指向主要和次要中的所有对象:

let myObject = {
    primary: { "large-object A" },
    secundary: [ {"large-object B"}, {"large-object C"}, {"large-object D"} ],
    all: []
}

if (!_.isEmpty(myObject.primary)) {
    myObject.all.push(myObject.primary)
}
myObject.all.push(...myObject.secundary) // spread = shallow copy

我现在不确定的是这个对象的内存使用量是否没有通过添加引用而增加。我的常识逻辑告诉我应该没有必要,但我担心浏览器或虚拟机中是否存在垃圾收集器、代码优化器、序列化器或其他任何东西,这可能仍会导致为“重复”对象分配内存。

所以这个问题可以提出如下:

问:对象中引用其他对象的对象是否仍然占用内存(除了引用“指针”本身)。

附带说明:我先推送主要对象,然后传播次要对象,以便主要对象仍然是结果数组中的第一个,在我的场景中,主要对象也可能只是一个空对象。

标签: javascriptmemory-management

解决方案


即使您传播元素,您也不会在第二层中深度克隆元素。那里没有重复的元素。你可以试试这个小小的简化,看看:

let a = { a: 1, b: 2 };
let b = [ {a: 3}, {a : 2} ];

let c = [];

c.push(...b);

console.log( c[0] === b[0] ); // true

推荐阅读