问题描述
我有一个像这样具有非常大属性的 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" },all: []
}
if (!_.isEmpty(myObject.primary)) {
myObject.all.push(myObject.primary)
}
myObject.all.push(...myObject.secundary) // spread = shallow copy
我现在不确定的是,这个对象的内存使用量是否不会因为添加引用而增加。我的常识逻辑告诉我应该没有必要,但我担心浏览器或 VM 中是否有垃圾收集器、代码优化器、序列化器或其他任何东西,这可能仍然会导致为“重复”对象分配内存。
所以问题可以提出:
问。对象中引用其他对象的对象是否仍然占用内存(引用“指针”本身除外)。
附带说明:我执行主要对象的推送,然后是次要对象的传播,因此主要对象仍将是结果数组中的第一个对象,在我的场景中,主要对象也可能只是一个空对象。
解决方法
即使你散布元素,你也不会在第二级深度克隆元素。那里没有重复的元素。你可以试试这个小小的简化,看看:
let a = { a: 1,b: 2 };
let b = [ {a: 3},{a : 2} ];
let c = [];
c.push(...b);
console.log( c[0] === b[0] ); // true